Logback appender which posts logs to slack via incoming webhook.
<repositories>
<repository>
<id>slack-webhook-appender</id>
<url>https://raw.github.com/dwango/slack-webhook-appender/mvn-repo/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>jp.co.dwango</groupId>
<artifactId>slack-webhook-appender</artifactId>
<version>0.2.0</version> <!-- replace with the latest version -->
</dependency>
</dependencies>
<configuration>
<appender name="SLACK" class="jp.co.dwango.logback.SlackWebhookAppender">
<webhookUrl>...</webhookUrl>
<timeout>50000</timeout>
<payload>
{
"channel": "#_channel",
"username": "username",
"icon_emoji": emoji,
"link_names": 1,
"attachments": [{
"title": level + " (" + hostname + ")",
"fallback": level + " (" + hostname + ")",
"color": color,
"fields": [{
"title": "Hostname",
"value": hostname,
"short": true
}, {
"title": "Time",
"value": timestamp,
"short": true
}, {
"title": "Level",
"value": level,
"short": true
}, {
"title": "Trigger",
"value": message,
"short": false
}]
}]
}
</payload>
</appender>
<appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="SLACK" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_SLACK" />
</root>
</configuration>
Key | Required | Detail |
---|---|---|
webhookUrl | Y | URL of incoming webhook. |
timeout | N | Timeout of posting to Slack in milliseconds. (Default 50,000 milliseconds) |
payload | Y | Payload written in JavaScript to send to Slack. |
- Written in JavaScript
- Available Buildin variables
Variable Name | Type | Description |
---|---|---|
event | ILoggingEvent | The representation of logging events. see API |
property(name) | function | A function to get a property in which only context properties or system properties are accessible. For a key passed as argument, the property() methods return the String value of the property. |
hostname | string | Hostname where the event occurred |
level | string | Log level. eg. FATAL, ERROR, WARN, INFO, DEBUG, TRACE. |
timestamp | string | Time when the event occurred. eg. 2018-02-21T19:00:25.827+09:00 |
message | string | The message of logging events. |
color | string | Color according to log level. |
emoji | string | Emoji according to log level. |
{
"channel": "#_channel",
"username": "username",
"icon_emoji": emoji,
"link_names": 1,
"attachments": [{
"title": level + " (" + hostname + ")",
"fallback": level + " (" + hostname + ")",
"color": color,
"fields": [{
"title": "Hostname",
"value": hostname,
"short": true
}, {
"title": "Time",
"value": timestamp,
"short": true
}, {
"title": "Level",
"value": level,
"short": true
}, {
"title": "Trigger",
"value": message,
"short": false
}]
}]
}
var env = 'dev', mention = '';
if(hostname.indexOf('dev') == -1) {
env = 'production'; mention = '@channel';
}
return {
"channel": "#_channel",
"username": "username",
"icon_emoji": emoji,
"link_names": 1,
"attachments": [{
"title": level + " ( " + env + " ) " + mention,
"fallback": level + " ( " + hostname + " )",
"color": color,
"fields": [{
"title": "Hostname",
"value": hostname,
"short": true
}, {
"title": "Time",
"value": timestamp,
"short": true
}, {
"title": "Level",
"value": level,
"short": true
}, {
"title": "Trigger",
"value": message,
"short": false
}]
}]
};
<configuration>
<appender name="SLACK" class="jp.co.dwango.logback.SlackWebhookAppender">
<webhookUrl>...</webhookUrl>
<channel>...</channel>
<username>...</username>
<layout>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</layout>
</appender>
<appender name="ASYNC_SLACK" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="SLACK" />
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<root level="INFO">
<appender-ref ref="ASYNC_SLACK" />
</root>
</configuration>
Key | Required | Detail |
---|---|---|
webhookUrl | Y | URL of incoming webhook |
channel | Y | channel to post logs to |
username | Y | username which post logs as |
iconEmoji | N | icon of the user; you probably want colons like :smiley: |
iconUrl | N | icon of the user |
linkNames | N | (true / false ) If false , you will not be notified by posing message which includes @channel , @{username} and so forth (true by default) |
sbt release