登录:应用程序错误通知

几个月前,当我进行大型应用程序重构时,发现用于记录日志的基于log4j的代码确实令人讨厌,重复了数百次:

if (LOG.isDebugEnabled()) {LOG.debug("Logging some stuff = " + stuff);
}

我想摆脱isXXXEnabled,这就是我找到Logback和SLF4J的方式 。  

登录和SLF4J

与SLF4J结合使用的Logback提供了出色的API和快速强大的日志记录框架实现。 从log4j切换到Logback的原因不是本文的主题,它们已经在logback网站上进行了详细描述。 很快,您会发现Logback和SL4FJ有什么用:

  • 跳过isXXXEnabled的简单快速方法:
    LOG.debug("Logging some stuff = {}", stuff);
  • 自动重载配置文件
  • 强大的日志过滤器
  • 将属性文件加载到配置xml中
  • 条件配置

借助SLF4J迁移工具,从log4j api迁移到SLF4J的速度非常快。 我已经决定将所有项目都切换到Logback,几个月后,我不得不说我对这个决定感到非常满意。

为了在您的项目中使用Logback,请添加以下依赖项:

<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.6.4</version>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.0.1</version>
</dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.6.4</version>
</dependency>

使用Logback设置错误通知

在具有正确日志记录的应用程序中,应将每个级别为ERROR的条目记录为应解决的问题。

当然,最常见的记录错误的方法是使用堆栈跟踪将异常记录到日志文件中,但是如果您在多台主机上有大量应用程序,则检查错误可能很耗时。 聪明的方法是将它们登录到数据库中,这可以通过DBAppender实现。 我发现在电子邮件中发送所有异常以立即修复它们最有帮助。

为了将Logback设置为发送异常邮件,我们需要添加Java Mail依赖项:

<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4</version>
</dependency>

并在logback.xml中定义SMTPAppender的配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- some application specific configuration here --><appender name="sheriff" class="ch.qos.logback.classic.net.SMTPAppender"><smtpHost>localhost</SMTPHost><from>sheriff@mycompany.com</From><to>john@mycompany.com</To><subject>Something went wrong</Subject><layout class="ch.qos.logback.classic.html.HTMLLayout"/><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter></appender><root level="ERROR"><appender-ref ref="sheriff" /></root>
</configuration>

由于将ThresholdFilter的级别设置为ERROR,我们可以确保即使更改了根级别,也只能发送错误邮件。

现在,您应该会收到类似于以下内容的电子邮件:

在开发环境中跳过错误通知

可能您将不需要接收来自开发环境的那些邮件,并且由于有logback配置中的条件,您可以轻松地跳过它们。

为了使用条件,您需要向Janino添加依赖项:

<dependency><groupId>janino</groupId><artifactId>janino</artifactId><version>2.5.10</version>
</dependency>

下一步是了解您的环境。 在Logback配置中,您可以访问系统属性,logback属性或特殊变量(例如HOSTNAME和CONTEXT_NAME)以及它们来确定您的环境。 在我的应用程序中, 我使用Spring配置文件 ,因此我的ROOT记录器配置为:

<root level="ERROR"><if condition='"${spring.profiles.active}" == "production"'><appender-ref ref="sheriff" /></if>
</root>

log4j用户的常用词汇

如果您决定坚持使用log4j,则可以使用SMTPAppender 。

由于log4j-over-slf4j库,Log4j可以与SLF4J一起使用。  

结论

使用Logback发送邮件不是通知错误的唯一方法。 可以使用Jabber附加程序 ,甚至可以编写将通过SMS网关发送错误的附加程序。 由你决定。

您在项目中使用了哪些错误通知解决方案?

参考: Software Development Journey博客上的JCG合作伙伴 Maciej Walkowiak提供了带有Logback的应用程序错误通知 。


翻译自: https://www.javacodegeeks.com/2012/07/logback-application-errors-notification.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 oracle怎样卸载,Win10系统卸载Oracle 11g数据库的方法

说起Oracle 11g数据库编程人员没有一个不知道的&#xff0c;虽然它很好用&#xff0c;但是有时候我们也会想去卸载它&#xff0c;那么系统城win10纯净版怎么卸载Oracle 11g数据库呢&#xff1f;不知道的朋友赶紧看看小编整理的卸载Oracle 11g数据库的方法吧&#xff01;具体卸载…

.net 连接数据库

""符号是防止将后面字符串中的"\"解析为转义字符. using System.Data; using System.Data.SqlClient; ... string strConnection"user idsa;password;"; strConnection"initial catalogNorthwind;ServerYourSQLServer;"; st…

mysql DCL数据控制语言

-- 维护性操作 都是在cmd下操作的连接数据库&#xff1a; 本机&#xff1a;mysql [-h localhost] -u account -p 远程&#xff1a;mysql [-h remote_ip] -u account -p 显示当前所有数据库&#xff1a;show databases; 切换数据库&#xff1a;use db_name; …

如何分析线程转储–线程堆栈跟踪

本文是“ 线程转储”分析系列的第5部分。 到目前为止&#xff0c;您已经了解了线程的基本原理以及它们与Java EE容器和JVM的交互。 您还学习了HotSpot和IBM Java VM的不同线程转储格式。 现在是您深入分析过程的时候了。 为了使您能够从线程转储中快速识别问题模式&#xff0c;…

linux想要ping需要开启哪个端口,linux下iptales配置

linux iptables存放位置/etc/sysconfig/iptables[roottp ~]#iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 1521 -j ACCEPT[roottp ~]#iptables -R INPUT 4 -s 172.17.99.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT[roottp ~]#iptables…

设计模式学习笔记(十三:原型模式)

1.1概述 用原型实例指定创建对象的种类&#xff0c;并且通过复制这些原型创建新的对象。这就是原型模式的定义。 在某些情况下&#xff0c;可能不希望反复使用类的构造方法创建许多对象&#xff0c;而是希望使用该类创建一个对象后&#xff0c;以该对象为原型得到该对象的若干个…

翻译的一篇关于学习编程语言的小文章

Top programming languages to get a job in Toronto in 2017 在程序开发人员和软件工程师中最容易被提及的问题之一就是&#xff1a;“我要学的下一门编程语言该是谁&#xff1f;” 我想去选一个编程语言&#xff0c;我希望你能给我一些关于经常使用到的编程语言的建议&#x…

从linux内核启动,学习Linux内核启动过程:从start_kernel到init

一、实验步骤&#xff1a;1&#xff1a;运行menuos&#xff1a;a)cd LinuxKernel/b)qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img启动后启动了MenuOS。2:使用gdb调试跟踪menuos内核启动和运行过程&#xff1b;a)qemu -kernel linux-3.18.6/arch/x86/bo…

【转】nginx的优缺点

原博文出自于&#xff1a;http://blog.csdn.net/a454211787/article/details/22494485 感谢! 1、nginx相对于apache优点&#xff1a; 轻量级同样起web 服务比apache占用更少内存及资源 抗并发nginx 处理请求异步非阻塞而apache 则阻塞型高并发下nginx 能保持低资源低消耗高…

与Maven 3,Failsafe和Cargo插件的集成测试

开箱即用&#xff0c;可以在Maven中进行单元测试。 因此&#xff0c;它也经常用于集成测试。 这样做的主要缺点是集成测试可能需要花费更多的时间来执行&#xff0c;并且因为没有人喜欢每次构建都要等待很长时间–使用-Dmaven.test.skiptrue标志可以跳过测试 为了执行与Maven的…

Spring入门第二十五课

使用具名参数 直接看代码&#xff1a; db.properties jdbc.userroot jdbc.passwordlogan123 jdbc.driverClasscom.mysql.jdbc.Driver jdbc.jdbcUrljdbc:mysql://localhost:3306/selective-courses-systemjdbc.initPoolSize5 jdbc.maxPoolSize10 applicationContext.xml <?x…

linux强制回收内存,Linu系统cache强制回收

LINUX的内存管理机制&#xff0c;一般情况下不需要特意去释放已经使用的cache。Cache机制的存在&#xff0c;使得Linux对磁盘的读写速度是有较大的好处的。 在 Linux 操作系统中&#xff0c;当应用程序需要读取文件中的数据时&#xff0c;操作系统先分配一些内存&#xff0c;将…

HDU 1412 {A} + {B}

Problem Description给你两个集合。要求{A} {B}.注:同一个集合中不会有两个同样的元素.Input每组输入数据分为三行,第一行有两个数字n,m(0<n,m<10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每一个元素为不超出int范围的整数,每一个元素之间有一个…

Google API:如何访问Google Analytics(分析)数据?

在深入研究Google Analytics&#xff08;分析&#xff09;API之前&#xff0c;了解一些Google Analytics&#xff08;分析&#xff09;术语及其关系总是很有用的。 Google帐户&#xff1a;要访问Google Analytics&#xff08;分析&#xff09;&#xff0c;用户将需要一个Google…

为什么linux的新得立软件下载,linux,debian_蝶变(Debian)_Xfce_新立得软件管理_安装不上软件了,怎么处理?,linux,debian - phpStudy...

蝶变(Debian)_Xfce_新立得软件管理_安装不上软件了,怎么处理&#xff1f;(synaptic:9573): GLib-CRITICAL **: g_child_watch_add_full: assertion pid > 0 failed正在预设定软件包 ...(正在读取数据库 ... 系统当前共安装有 343467 个文件和目录。)正准备解包 .../libc6-db…

设计模式学习笔记(十六:桥接模式)

1.1概述 将抽象部分与它的实现部分分离&#xff0c;使他们都可以独立地变化。这就是桥接模式的定义。 抽象类或接口中可以定义若干个抽象方法&#xff0c;习惯上将抽象方法称作操作。抽象类或接口使程序的设计者忽略操作的细节&#xff0c;即不必考虑这些操作是如何实现的&…

Request的getParameter和getAttribute方法的差别

HttpServletRequest.getParameter("modelName");能取到想要的modelObject吗&#xff1f;经过測试之后。发现是不能的。后来想想。其它道理挺简单的&#xff0c;当两个Web组件之间为转发关系时&#xff0c;转发源会将要共享request范围内的数据先用setAttribute将数据…

Spring Social入门–第2部分

几周前&#xff0c;我写了一篇文章&#xff0c;展示了我认为可以使用Spring Social编写的最简单的应用程序。 该应用程序读取并显示了Twitter用户的公共数据&#xff0c;并被编写为Spring Social和社交编码领域的介绍。 但是&#xff0c;让您的应用程序显示用户的公共数据只是故…

linux静默删除文件夹,Linux常用命令10 - unzip

zip 是最广泛使用的归档文件, 除了linux&#xff0c;windows也是非常的广泛。&#xff0c;支持无损数据压缩。 zip 文件是包含一个或多个压缩文件或目录的数据容器。接下来&#xff0c;我将解释如何使用 unzip 命令通过命令行解压缩 Linux 系统中的文件。 还有与之对应就是 zip…

Git学习笔记(一) 安装及版本库介绍

安装Git 最早Git是在Linux上开发的&#xff0c;很长一段时间内&#xff0c;Git也只能在Linux和Unix系统上跑。不过&#xff0c;慢慢地有人把它移植到了Windows上。现在&#xff0c;Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。 在Linux上安装Git 首先&#xff…