开发过程中,难免会有发生错误或异常的时候,有些是需要及时通知到相关开发人员的。logback可以通过简单的配置达到邮件告警的目的。

一、错误告警

如下配置,所有Error级别的log发送邮件告警给receiver(多个receiver以逗号分隔)

<?xml version="1.0" encoding="UTF-8"?>
<configuration> <springProperty scope="context" name="receiver" source="log.email.receiver" defaultValue="xxxxxx@qq.com"/>
<springProperty scope="context" name="env" source="spring.profiles.active" defaultValue="dev"/> <property name="smtpHost" value="localhost" />
<property name="smtpPort" value="25" />
<property name="username" value="username" />
<property name="password" value="password" />
<property name="from" value="send@126.com" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level][%thread]:%logger{50} [%method:%line] %msg%n</pattern>
</encoder>
</appender> <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>1</bufferSize>
</cyclicBufferTracker> <smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<from>${from}</from>
<to>${receiver}</to>
<subject>【test-email Error】【${env}环境】: %logger{20} - %m </subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%level%thread%logger{35}%message</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender> <springProfile name="dev,test">
<root>
<level value="info"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="EMAIL"/>
</root>
</springProfile> <springProfile name="uat,pro">
<root>
<level value="info"/>
<appender-ref ref="EMAIL"/>
</root>
</springProfile>
</configuration>

Error级别日志:

log.error("an unexpected error!");

收到告警邮件:

记入ex,可以看到详细的堆栈信息。

a、springProperty 从spring读取配置

<springProperty scope="context" name="receiver" source="log.email.receiver"  defaultValue="xxxxxx@qq.com"/>

scope:context 参考(官网

name:定义的变量名

source:需要spring配置的节点名称。(eg:log.email.receiver=xxx@126.com,yyy@qq.com)

defaultValue:默认值

二、自定义告警

上面是对所有Error级别日志的告警,有时候需要对正常业务的邮件通知,此时可以用Mark来发邮件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration> <springProperty scope="context" name="receiver" source="log.email.receiver" defaultValue="xxxxxx@qq.com"/>
<springProperty scope="context" name="env" source="spring.profiles.active" defaultValue="dev"/> <property name="smtpHost" value="localhost" />
<property name="smtpPort" value="25" />
<property name="username" value="username" />
<property name="password" value="password" />
<property name="from" value="send@126.com" /> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level][%thread]:%logger{50} [%method:%line] %msg%n</pattern>
</encoder>
</appender> <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
<bufferSize>1</bufferSize>
</cyclicBufferTracker> <smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<from>${from}</from>
<to>${receiver}</to>
<subject>【开发人员关注】【${env}环境】</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%level%thread%logger{35}%message</pattern>
</layout>
<!-- 基于标记的发送邮件 这里我们加入一个标记DEVELOP,发送日志时只需加入此标记即可,如有多个标记加入多个<maker></maker>标签即可 -->
<evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
<marker>DEVELOP</marker>
</evaluator>
</appender> <springProfile name="dev,test">
<root>
<level value="info"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="EMAIL"/>
</root>
</springProfile> <springProfile name="uat,pro">
<root>
<level value="info"/>
<appender-ref ref="EMAIL"/>
</root>
</springProfile>
</configuration>

Mark邮件示例:

log.info(MarkerFactory.getMarker("DEVELOP"), "notify developers!");

邮件:

三、自定义邮件格式

邮件自定义格式。实现自定义的 HTMLLayout:

public class MyHtmlLayout extends HTMLLayout {
IThrowableRenderer<ILoggingEvent> throwableRenderer;
private String tag; public MyHtmlLayout() {
super();
this.throwableRenderer = new DefaultThrowableRenderer();
} @Override
public String doLayout(ILoggingEvent event) {
StringBuilder buf = new StringBuilder();
this.startNewTableIfLimitReached(buf);
boolean odd = true;
if((this.counter++ & 1L) == 0L) {
odd = false;
} String level = event.getLevel().toString().toLowerCase();
buf.append(CoreConstants.LINE_SEPARATOR);
buf.append("<tr class=\"");
buf.append(level);
if(odd) {
buf.append(" odd\">");
} else {
buf.append(" even\">");
} buf.append(CoreConstants.LINE_SEPARATOR); for(Converter c = this.head; c != null; c = c.getNext()) {
this.appendEventToBuffer(buf, c, event);
} buf.append("</tr>");
buf.append(CoreConstants.LINE_SEPARATOR);
if(event.getThrowableProxy() != null) {
throwableRenderer.render(buf, event);
} return buf.toString();
} private void appendEventToBuffer(StringBuilder buf, Converter<ILoggingEvent> c, ILoggingEvent event) {
buf.append("<td class=\"");
buf.append(this.computeConverterName(c));
buf.append("\">");
buf.append(Transform.escapeTags(c.convert(event)) + ",my tag:" + tag);
buf.append("</td>");
buf.append(CoreConstants.LINE_SEPARATOR);
} public String getTag() {
return tag;
} public void setTag(String tag) {
this.tag = tag;
}
}

将logback-spring.xml配置改为(配置的tag):

<layout class="com.logback.demo.eval.MyHtmlLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}%level%thread%logger{35}%message</pattern>
<tag>this is my layout tag</tag>
</layout>

四、记日志报错

参考:

[日志]logback告警的更多相关文章

  1. 24 Zabbix系统配置日志监控告警--关键字触发

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 24 Zabbix系统配置日志监控告警--关键字触发 trapper是被监控主机主动发送数据给za ...

  2. Spring Boot系列一:默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  3. 【spring boot logback】日志logback格式解析

    日志logback格式解析 logback官网 格式解析 https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout 官网格式解析有 ...

  4. Spring Boot默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  5. (转)Spring Boot干货系列:(七)默认日志logback配置解析

    转:http://tengj.top/2017/04/05/springboot7/ 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的, ...

  6. springboot学习4使用日志:logback

    springboot学习4使用日志:logback 一.基本知识说明 SpringBoot默认使用logback作为日志框架 ,所以引入起步依赖后就可以直接使用logback,不需要其他依赖. Spr ...

  7. 第1节 storm日志告警:1、 - 5、日志监控告警业务需求、代码、集群运行、总结

    如何解决短信或者邮件频繁发送的问题:每次发送的时候都先查询数据库记录,看一下有没有给这个人发送消息,上一次发送消息的时间是什么时候,如果发送时间间隔小于半个小时,就不要再发了 ============ ...

  8. MS SQL 监控错误日志的告警信息

    SQL Server的错误消息(Error Message)按照消息的严重级别一共划分25个等级,级别越高,表示严重性也越高.但是如果你统计sys.messages,你会发现,实际上只有16(SQL ...

  9. SpringBoot配置日志logback

    1.这里我们选择logback,首先加入pom依赖 <dependency> <groupId>ch.qos.logback</groupId> <artif ...

随机推荐

  1. Vue-cli 安装使用和理解

    Vue 的 官方文档 提到 点开这个链接,跟着文档一步步直到: $ npm install -g vue-cli $ vue init webpack my-project $ cd my-proje ...

  2. Java操作文件转码

    package downloadTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.F ...

  3. 云计算之路-阿里云上:对“黑色n秒”问题的最终猜想——CPU C-states引起的

    如果说2013年云计算之路的主题是“踩坑”,那么2014年我们希望云计算之路的主题变成“填坑”——当然填坑是阿里云来完成的,我们只是见证曾经的坑坑洼洼变成平坦大道. 15号(周四)晚上我们发现了SLB ...

  4. Openstack实现共有云多flat网络

    首先给两台虚拟机添加网卡,模式为仅主机模式 配置控制节点IP /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=sta ...

  5. 关于LegacyExchangeDN的问题

    IMCEAEX i NDR This problem is not common but quite annoying and usually hard to understood by users. ...

  6. Logstash之时区问题的建议和修改---filter---and duplicate resolution.

    2. logstash es duplicate https://logstash.jira.com/browse/LOGSTASH-1875 https://logstash.jira.com/br ...

  7. closure--- 闭包与并行运算

      闭包有效的减少了函数所需定义的参数数目.这对于并行运算来说有重要的意义.在并行运算的环境下,我们可以让每台电脑负责一个函数,然后将一台电脑的输出和下一台电脑的输入串联起来.最终,我们像流水线一样工 ...

  8. spring boot 系列学习记录

    ——初始篇 结束了短学期的课程,初步学习了ssm框架,凭借这些学到的知识完成了短学期的任务-----点餐系统. 通过学长了解到了spring boot ,自己对spring cloud有所耳闻,但是s ...

  9. Vue1.x 到Vue2.0的一个变化

    小弟初来乍到,写的不好的地方还望指正.谢谢各位! 废话不多说  进入正题: Vue1.x到2.0的一个变化 1. 在每个组件模板,不在支持片段代码  组件中模板: 之前:     <templa ...

  10. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...