With Grails 3 we also get Spring Boot Actuator. We can use Spring Boot Actuator to add some production-ready features for monitoring and managing our Grails application. One of the features is the addition of some endpoints with information about our application. By default we already have a /health
endpoint when we start a Grails (3+) application. It gives back a JSON response with status UP. Let's expand this endpoint and add a disk space, database and url health check indicator.
We can set the application property endpoints.health.sensitive
to false
(securing these endpoints will be another blog post) and we automatically get a disk space health indicator. The default threshold is set to 10MB, so when the disk space is lower than 10MB the status is set to DOWN. The following snippet shows the change in the grails-app/conf/application.yml
to set the property:
Continue reading →
We can let Grails log some extra information when the application starts. Like the process ID (PID) of the application and on which machine the application starts. And the time needed to start the application. The GrailsApp
class has a property logStartupInfo
which is true
by default. If the property is true than some extra lines are logged at INFO and DEBUG level of the logger of our Application
class.
So in order to see this information we must configure our logging in the logback.groovy
file. Suppose our Application
class is in the package mrhaki.grails.sample.Application
then we add the following line to see the output of the startup logging on the console:
Continue reading →
Since Grails 3 we can borrow a lot of the Spring Boot features in our applications. If we look in our Application.groovy
file that is created when we create a new Grails application we see the class GrailsApp
. This class extends SpringApplication
so we can use all the methods and properties of SpringApplication
in our Grails application. Spring Boot and Grails comes with the class ApplicationPidFileWriter
in the package org.springframework.boot.actuate.system
. This class saves the application PID (Process ID) in a file application.pid
when the application starts.
In the following example Application.groovy
we create an instance of ApplicationPidFileWriter
and register it with the GrailsApp
:
Continue reading →
When we want to explain in our documentation which keys a user must press to get to a function we can use the keyboard macro in Asciidoctor. The macro will output the key nicely formatted as a real key on the keyboard. The syntax of the macro is kbd:[key]
. To get the desired output we must set the document attribute experimental
otherwise the macro is not used.
In the next Asciidoctor example file we use the keyboard macro:
Continue reading →
In Gradle we can configure how duplicate files should be handled by the Copy
task. Actually we can configure how duplicate files are handled by any task that implements the CopySpec
interface. For example archive tasks also implements this interface. We must use the setDuplicatesStrategy
method to configure how Gradle behaves. The parameter is a value of the enumeration DuplicatesStrategy
. We can use the values from the enum class or use String
values, which are automatically converted to enum DuplicatesStrategy
values.
We can choose the following strategies:
Continue reading →
The nice thing about Gradle is that we can use Java libraries in our build script. This way we can add extra functionality to our build script in an easy way. We must use the classpath
dependency configuration for our build script to include the library. For example we can include the library Grgit, which provides an easy way to interact with Git from Java or Groovy code. This library is also the basis for the Gradle Git plugin.
In the next example build file we add the Grgit library to our build script classpath. Then we use the open
method of the Grgit
class. From the returned object we invoke the head
to get the commit id identified as id
. With the abbreviatedId
property we get the shorter version of the Git commit id. The build file also includes the application
plugin. We customize the applicationDistribution
CopySpec
from the plugin and expand the properties in a VERSION
file. This way our distribution always includes a plain text file VERSION
with the Git commit id of the code.
Continue reading →
When we convert our Asciidoctor markup to HTML we automatically get a head
and footer element. We can add custom content to the HTML head
element and to the HTML div
with id footer. We must set a document attribute and create the files that contain the HTML that needs to be added to the head or footer. We have three different document attributes we can set to include the custom content files:
:docinfo:
include document specific content. Files to be included must be named <docname>-docinfo.html
for head
element and <docname>-docinfo-footer.html
for footer content.
:docinfo1:
include general custom content. Files to be included must be named docinfo.htmtl
for head
element and docinfo-footer.html
for footer content.
:docinfo2:
include document specific and general custom content. Files to be included must be named <docname>-docinfo.html
and docinfo.html
for head
element and <docname>-docinfo-footer.html
and docinfo-footer.html
for footer content.
Continue reading →
For Java or Groovy projects we can use the application plugin in Gradle to run and package our application. The plugin adds for example the startScripts
task which creates OS specific scripts to run the project as a JVM application. This task is then used again by the installDist
that installs the application, and distZip
and distTar
tasks that create a distributable archive of the application. The startScripts
tasks has the properties unixScript
and windowsScript
that are the actual OS specific script files to run the application. We can use these properties to change the contents of the files.
In the following sample we add the directory configuration
to the CLASSPATH
definition:
Continue reading →
Grails 3 is based on Spring Boot. This means we can use a lot of the stuff that is available in Spring Boot now in our Grails application. If we look at the logging of a plain Spring Boot application we notice the logging has colors by default if our console supports ANSI. We can also configure our Grails logging so that we get colors.
First we need to change our logging configuration in the file grails-app/conf/logback.groovy
:
Continue reading →
In Spring we can use the @Value
annotation to set property or arguments values based on a SpEL expression. If we want to use the @Value
annotation for a constructor argument we must not forget to add the @Autowired
annotation on the constructor as well.
// File: sample/Message.groovy
package sample
import org.springframework.beans.factory.annotation.*
import org.springframework.stereotype.*
@Component
class Message {
final String text
// Use @Autowired to get @Value to work.
@Autowired
Message(
// Refer to configuration property
// app.message.text to set value for
// constructor argument text.
@Value('${app.message.text}') final String text) {
this.text = text
}
}
Continue reading →
A good thing in Grails is that in Grails artifacts like controllers and services we have a log
property to add log statements in our code. If we want to have the output of these log statements we must use a special naming convention for the log names. Each logger is prefixed with grails.app
followed by the Grails artifact. Valid artifact values are controllers
, services
, domain
, filters
, conf
and taglib
. This is followed by the actual class name. So for example we have a controller SampleController
in the package mrhaki.grails
then the complete logger name is grails.app.controllers.mrhaki.grails.SampleContoller
.
The following sample configuration is for pre-Grails 3:
Continue reading →
Grails 3 is based on Spring Boot. This means we get a lot of the functionality of Spring Boot into our Grails applications. A Spring Boot application has by default a banner that is shown when the application starts. The default Grails application overrides Spring Boot's behavior and disables the display of a banner. To add a banner again to our Grails application we have different options.
First we can add a file banner.txt
to our classpath. If Grails finds the file it will display the contents when we start the application. Let's add a simple banner with Grails3 in Ascii art in the file src/main/resources/banner.txt
. By placing the file in src/main/resources
we can assure it is in the classpath as classpath:/banner.txt
:
Continue reading →