slf4j+log4j2模式的日志搭建
前言:今天打算为大家介绍一下我们我们在项目中必须得有的一个部分——日志!是的,就是那些让我们看着头疼的东西~~~好的日志可以帮助团队成员快速发现并解决问题,用好了可以大幅度提高代码缺陷修复效率!言归正传,今天先来讲讲如何为一个项目建立日志!解决方案:(slf4j+log4j2)
项目地址:https://github.com/ksuth/wsyq.git
原理介绍:
现在行业内有很多关于日志记录的jar包,我选用的slf4j可以通俗的理解为一个日志调用的接口,其本身里面是没有关于日志的具体实现,所以我选用了log4j作为它的具体实现。(这也是目前用得比较多吧~~)当然如果你觉得不好,也可以选用其他具体日志作为其实现。
环境搭建:1.在你的maven项目中引入如下依赖:(这是我写测试时候的版本,相互之间可兼容,如需使用其他版本请确定其兼容性)
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency><dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
2.新增log4j2.xml的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
<Properties>
<Property name="baseDir">/logtest</Property>
</Properties>
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %p [%c] [%M] [Line:%L] - <%m>%n"/>
</Console>
<RollingFile name="RollingFile" fileName="${baseDir}/logs/app.log"
filePattern="${baseDir}/logs/app-%d{MM-dd-yyyy}.log.gz">
<RegexFilter regex=".*password.*" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<pattern>%d %p %c{1.} [%t] %m%n</pattern>
</PatternLayout>
<TimeBasedTriggeringPolicy />
</RollingFile>
</Appenders>
<Loggers>
<AsyncLogger name="test.log.shuyuq" level="debug" additivity="false" includeLocation="true">
<AppenderRef ref="RollingFile"/>
</AsyncLogger>
<AsyncRoot level="info">
<AppenderRef ref="console"/>
</AsyncRoot>
</Loggers>
</Configuration>
3.包装原生日志:(这个并不是必须的,主要应用于公司对日志有特别的规范,或者业务处理中需要一些特别的记录)项目日志类:
@Data
public class CASLogger {
/** LOGINDEVICE */
private static final String LOGINDEVICE="loginDevice";
/** slf4j */
private Logger log;/**
* 调用类名
* @param name String
*/
public CASLogger(String name) {
log = org.slf4j.LoggerFactory.getLogger(name);}
/**
* 此处用于重写需要用的的log方法
*/}
为项目日志类提供静态的调用方式:
package util;
import java.util.HashMap;
import java.util.Map;/**
* 功能描述: 日志添加
* @author shuyuq
* @date 2018-8-17
**************************************************/public class LoggerFactory {
private static Object initLock = new Object();
private static Map<String, CASLogger> loggerMap = new HashMap<String, CASLogger>();/**
* 功能描述: 获取Logger
* @param name String
* @return CASLogger CASLogger
* Date: 2018-8-17
*/
public static CASLogger getLogger(String name) {
CASLogger casLogger = null;
synchronized(initLock) {
casLogger = loggerMap.get(name);
if (casLogger == null) {
casLogger = new CASLogger(name);
loggerMap.put(name, casLogger);
}
}
return casLogger;
}
/**
* 功能描述: 获取Logger
* @param clazz String
* @return CASLogger CASLogger
* Date: 2018-8-17
*/
public static CASLogger getLogger(Class<?> clazz) {
String name=clazz.getName();
CASLogger casLogger = null;
synchronized(initLock) {
casLogger = loggerMap.get(name);
if (casLogger == null) {
casLogger = new CASLogger(name);
loggerMap.put(name, casLogger);
}
}
return casLogger;
}
}
做到这儿整个项目的简单日志文件就已经搭建好啦~下面着重为大家介绍一下log4j2的配置文件!这也是实现其日志个性化的核心!
配置说明:
1.配置文件加载的优先级:
classpath下名为 log4j-test.json 或者log4j-test.jsn文件
classpath下名为 log4j2-test.xml
classpath下名为 log4j.json 或者log4j.jsn文件
classpath下名为 log4j2.xml文件
2.简单参数介绍:
先为大家贴上log4j的官方文档地址:https://logging.apache.org/log4j/2.x/
如果需要实现一些特别的个性化功能可参考官方文档
我在这儿为大家介绍一些比较常用的参数:
Properties:这个参数主要用于为配置文件定义一些常用量,可参考上面的配置中我为其定义了一个文件写的路径
Appenders:用于包裹Appender标签,每一个Appender为一个OutputStream
Loggers:用于包裹Logger标签,Logger标签用于筛选路径(类比于spring的扫描路径)和指定需要使用的Appender
3.RollingFileAppender
RollingFileAppender是一个OutputStreamAppender,它写入fileName参数中指定的File,并根据TriggeringPolicy和RolloverPolicy滚动文件。RollingFileAppender使用RollingFileManager(扩展OutputStreamManager)来实际执行文件I / O并执行翻转。虽然无法共享来自不同配置的RolloverFileAppenders,但如果可以访问Manager,则可以使用RollingFileManagers。例如,如果Log4j位于两个共用的ClassLoader中,则servlet容器中的两个Web应用程序可以拥有自己的配置并安全地写入同一文件。
RollingFileAppender需要TriggeringPolicy和 RolloverStrategy。触发策略确定是否应在RolloverStrategy定义如何进行翻转时执行翻转。如果未配置RolloverStrategy,则RollingFileAppender将使用DefaultRolloverStrategy。从log4j-2.5开始,可以在DefaultRolloverStrategy中配置自定义删除操作以在翻转时运行。从2.8开始,如果没有配置文件名, 则将使用DirectWriteRolloverStrategy而不是DefaultRolloverStrategy。从log4j-2.9开始,自定义POSIX文件属性查看动作 可以在DefaultRolloverStrategy中配置以在rollover中运行,如果未定义,将应用RollingFileAppender继承的POSIX文件属性视图。
RollingFileAppender不支持文件锁定。
关于参数的问题~~~(在官网中找到Appenders搜索RollingFileAppender可以找到对应内容
| 参数名称 | 类型 | 说明 |
| append | boolean | 默认为true,记录追加到文件的最后,否则就先清除以前的记录再写入 |
| bufferedIO | boolean | 如果为true - 默认情况下,记录将写入缓冲区,当缓冲区已满时,数据将写入磁盘;如果设置了immediateFlush,则写入记录时。文件锁定不能与bufferedIO一起使用。性能测试表明,即使启用了immediateFlush,使用缓冲I / O也可以显着提高性能。 |
| bufferSize | int | 当bufferedIO为true时,这是缓冲区大小,默认为8192字节。 |
| createOnDemand | boolean | appender按需创建文件。appender仅在日志事件通过所有过滤器并将其路由到此appender时创建该文件。默认为false. |
| filter | Filter | 过滤器,用于确定此Appender是否应该处理该事件。使用CompositeFilter可以使用多个Filter |
| fileName | String | 要写入的文件的名称。如果文件或其任何父目录不存在,则将创建它们。 |
| filePattern | String | 归档日志文件的文件名模式。模式的格式取决于使用的RolloverPolicy。DefaultRolloverPolicy将同时接受与SimpleDateFormat兼容的日期/时间模式 和/或表示整数计数器的%i。该模式还支持在运行时进行插值,因此任何查找(例如DateLookup)都可以包含在模式中 |
| immediateFlush | boolean | 设置为true时 - 默认值,每次写入后都会进行刷新。这将保证数据写入磁盘,但可能会影响性能。
每次写入后刷新仅在将此appender与同步记录器一起使用时才有用。即使immediateFlush设置为false,异步记录器和追加器也会在一批事件结束时自动刷新。这也保证了数据被写入磁盘但效率更高 |
| layout | Layout | 用于格式化LogEvent的布局。如果未提供布局,则将使用“%m%n”的默认图案布局。 |
| name | String | Appender的名字 |
| policy | TriggeringPolicy | 用于确定是否应发生翻转的策略 |
| strategy | RolloverStrategy | 用于确定存档文件的名称和位置的策略 |
| 参数名称 | 类型 | 说明 | |||
| ignoreExceptions | boolean | 默认值为true,导致在将事件附加到内部记录然后被忽略时遇到异常。设置为false时,异常将传播给调用者。将此Appender包装在FailoverAppender中时, 必须将此参数设置为false。 | |||
| filePermissions | String | POSIX格式的文件属性权限,以便在创建文件时应用 | |||
| fileOwner | String | 文件所有者在每次创建文件时定义,出于安全原因,可能会限制更改文件的所有者,并且不允许操作IOException。如果_POSIX_CHOWN_RESTRICTED对路径有效,则只有具有等效于文件用户ID或具有适当权限的有效用户ID的进程才能更改文件的所有权。 | |||
| fileGroup | String |
文件组,用于定义创建文件的时间 |
slf4j+log4j2模式的日志搭建的更多相关文章
- Springboot + SLF4j + Log4j2 打印异常日志时,耗时要5-6秒
1.使用jps -l 查看springboot项目的进程ID 2.使用命令jstack -l 进程ID > log.txt 打印堆栈信息到文件,内容如下: "http-nio-8065 ...
- IDEA项目搭建十——使用slf4j和logback进行日志记录
.简介 java里面日志分为两部分一个门面.一个实现,我们所熟知的SLF4j.Log4j.Log4j2.Logback的日志组件slf4j是门面提供的统一的入口,具体实现由log4j.log4j2.l ...
- Spring Boot 整合 slf4j+log4j2 实现日志管理
背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...
- java日志管理 - slf4j+log4j2
1 . 概述 1.1 日志框架实现 log4j是apache实现的一个开源日志组件: logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j ...
- 007-log-log4j2、slf4j+log4j2
一.概述 而log4j2的性能无论在同步日志模式还是异步日志模式下都是最佳的. 根本原因在于log4j2使用了LMAX, 一个无锁的线程间通信库代替了, logback和log4j之前的队列. 并发性 ...
- 日志框架(Log4J、SLF4J、Logback)--日志规范与实践
文章目录 一.Log4j 1.1新建一个Java工程,导入Log4j包,pom文件中对应的配置代码如下: 1.2resources目录下创建log4j.properties文件. 1.3输出日志 1. ...
- 记一次项目上线后Log4j2不输出日志的坑
公司项目采用了Log4j2来输出日志,在开发环境和测试环境下均可以输出日志,但在生成环境就没有日志输出.开始毫无头绪,后来通过不断的排查,终于解决了这个问题.在此记录下该问题的解决过程,便于后 ...
- slf4j+log4j2的配置
昨天自己测试了一下slf4j+log4j2的配置,可以正常使用,虽然配置十分简单,但好记性不如烂笔头,想想还是记录下来吧. 运行的环境:jdk1.7.tomcat7.Maven的web项目 1.在新建 ...
- 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志
SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部分:SQL ...
随机推荐
- tcc-transaction 分析
tcc-transaction是TCC型事务java实现,具体项目地址 点我.本文通过tcc-transaction和Springcloud,分析下tcc-transaction的原理. 要了解一个 ...
- Java进阶篇设计模式之三 ----- 建造者模式和原型模式
前言 在上一篇中我们学习了工厂模式,介绍了简单工厂模式.工厂方法和抽象工厂模式.本篇则介绍设计模式中属于创建型模式的建造者模式和原型模式. 建造者模式 简介 建造者模式是属于创建型模式.建造者模式使用 ...
- 105 - kube-scheduler源码分析 - predicate算法注册
一.predicate注册过程 今天我们来聊聊predicate函数是怎么被注册进去的,也就是要执行的一堆predicate是怎么成为“选中的孩子”. 代码位置:pkg/scheduler/fact ...
- 版本控制工具——Git常用操作(上)
本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...
- ajax的嵌套需要注意的问题
当我们要嵌套ajax的时候,需要注意 异步/同步 的处理,一般是要设置成同步,如果是异步,那么被嵌套的ajax的操作很可能获取不到想要的值,因为他可能比嵌套他的ajax跑的更早 在ajax中有一个as ...
- Struts2笔记_值栈
A.值栈概述 值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西.struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区 ...
- js字符串转json格式与json对象转字符串
json字符串----->json对象json对象------>json字符串 使用JSON.parse()函数 this.dataList = JSON.parse(dataList); ...
- springboot2.0拦截器和webconfigure配置
接下来介绍一下springboot如何配置拦截器,很简单,只需要两个配置文件就可以了 首先配置登陆拦截器 @Component public class LoginInterceptor implem ...
- Webpack4教程 - 第二部分,使用loader处理scss,图片以及转换JS
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://wanago.io/2018/07/16/webpack-4-course-par ...
- Linux使用wget、安装Python
原文:https://blog.csdn.net/ghost_chou/article/details/81905302 1.指定需要安装的目录或创建并访问到该选择的目录下. mkdir /data/ ...