log4j教程
- 格式:pdf
- 大小:675.25 KB
- 文档页数:8
log4j删除日志原理详解1. 什么是log4jlog4j是一个Java日志框架,用于记录应用程序的日志信息。
它是Apache软件基金会的一个开源项目,被广泛用于Java应用程序中。
log4j提供了灵活的配置选项,可以将日志输出到不同的目标(如控制台、文件、数据库等),并且可以根据日志级别过滤不同类型的日志信息。
2. log4j的基本原理log4j的基本原理可以归纳为以下几个步骤:步骤1:配置log4j在使用log4j之前,需要先进行配置。
log4j的配置文件通常为log4j.properties或log4j.xml,其中定义了日志输出的目标、格式、级别等信息。
步骤2:引入log4j库在Java应用程序中引入log4j库,以便在代码中使用log4j提供的API进行日志记录。
步骤3:获取Logger对象在代码中通过调用Logger.getLogger()方法获取Logger对象。
每个Logger对象与一个特定的类关联,用于记录该类产生的日志信息。
步骤4:设置日志级别通过调用Logger对象的setLevel()方法设置该Logger对象所记录的日志级别。
只有达到指定级别及以上的日志信息才会被记录。
步骤5:编写日志记录语句在代码中通过调用Logger对象的不同方法(如debug()、info()、warn()、error()等)编写日志记录语句。
根据不同的日志级别,选择合适的方法进行日志记录。
步骤6:输出日志当代码中执行了Logger对象的日志记录方法后,log4j会根据配置文件中的设置,将相应级别的日志信息输出到指定目标(如控制台、文件、数据库等)。
3. log4j删除日志原理在实际应用中,由于业务需求或存储空间限制,我们可能需要定期删除过时的日志信息。
log4j提供了一些机制来实现删除日志的功能。
基于时间戳删除log4j允许我们在配置文件中设置一个时间戳(或日期),当达到这个时间戳后,自动删除该时间之前的所有日志信息。
Log4j配置最全说明1. log4j 的配置文件Log4j 支持两种配置文件格式,一种是 XML 格式的文件,一种是Java 特性文件 lg4j.properties (键 = 值)。
1.1. log4j configuration scripts in properties formatlg4j.properties 文件作为作为常用的配置文件的方法如下:配置根 LoggerLogger 负责处理日志记录的大部分操作。
其语法为:log4j.rootLogger = [ level ] , appenderName, appenderName, … 其中, level 是日志记录的优先级,分为 OFF 、 FATAL 、 ERROR 、WARN 、 INFO 、 DEBUG 、 ALL 或者自定义的级别。
Log4j 建议只使用四个级别,优先级从高到低分别是 ERROR 、 WARN 、INFO 、 DEBUG 。
通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。
比如在这里定义了 INFO 级别,只有等于及高于这个级别的才进行处理,则应用程序中所有 DEBUG 级别的日志信息将不被打印出来。
ALL: 打印所有的日志, OFF :关闭所有的日志输出。
appenderName 就是指定日志信息输出到哪个地方。
可同时指定多个输出目的地。
Appender配置日志信息输出目的地 Appender 负责控制日志记录操作的输出。
其语法为:log4j.appender.appenderName =.of.appender.classlog4j.appender.appenderName.option1 = value1log4j.appender.appenderName.optionN = valueN其中, Log4j 提供的 appender 有以下几种:org.apache.log4j.ConsoleAppender (控制台),org.apache.log4j.FileAppender (文件),org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件),org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件),可通过log4j.appender.R.MaxFileSize=100KB 设置文件大小,还可通过log4j.appender.R.MaxBackupIndex=1 设置为保存一个备份文件。
log4j2⽤asyncRoot配置异步⽇志是如何使⽤disruptor⽤asyncRoot配置对应的对接disruptor类是AsyncLoggerConfigDisruptor,⽤Log4jContextSelector启动参数配置全局异步的对应的对接disruptor类是AsyncLoggerDisruptor。
下⾯分析的是AsyncLoggerConfigDisruptordisruptor的创建与启动需要的部件实现AsyncLoggerConfigDisruptor.start⽅法⽤来创建并启动disruptor实例创建disruptor需要EventFactory,ringBuffer的⼤⼩,ThreadFactory,ProducerType,等待策略waitStrategy创建后需要设置ExceptionHandler,设置EventHandler。
发布(⽣产)事件的translator。
EventFactory分是否可变(mutable字段)场景对应两个不同的EventFactory。
不可变的factory的逻辑是:@Overridepublic Log4jEventWrapper newInstance() {return new Log4jEventWrapper();}可变的factory逻辑是:public Log4jEventWrapper newInstance() {return new Log4jEventWrapper(new MutableLogEvent());}会在Log4jEventWrapper的构造函数中传⼊MutableLogEvent实例。
ringBuffer的⼤⼩是根据AsyncLoggerConfig.RingBufferSize配置值算出来的。
这个配置项的值最⼩不能⼩于128,默认值分两种情况进⾏设定:如果启⽤了ENABLE_THREADLOCALS(优化GC的⼀个配置项),那么默认值是4 * 1024,否则是256 * 1024。
log4j2⾃动删除过期⽇志⽂件的配置及实现原理 ⽇志⽂件⾃动删除功能必不可少,当然你可以让运维去做这事,只是这不地道。
⽽⽇志组件是⼀个必备组件,让其多做⼀件删除的⼯作,⽆可厚⾮。
本⽂就来探讨下 log4j 的⽇志⽂件⾃动删除实现吧。
0.⾃动删除配置参考样例: (log4j2.xml)<?xml version="1.0" encoding="UTF-8" ?><Configuration status="warn" monitorInterval="30" strict="true"schema="Log4J-V2.2.xsd"><Properties><Property name="log_level">info</Property></Properties><Appenders><!-- 输出到控制台 --><Console name="Console" target="SYSTEM_OUT"><ThresholdFilter level="${log_level}" onMatch="ACCEPT" onMismatch="DENY" /><PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%t] %p - %c - %m%n" /></Console><!-- 与properties⽂件中位置存在冲突,如有问题,请注意调整 --><RollingFile name="logFile" fileName="logs/app/test.log"filePattern="logs/app/history/test-%d{MM-dd-yyyy}-%i.log.gz"><ThresholdFilter level="${log_level}" onMatch="ACCEPT" onMismatch="DENY" /><PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%p] [%c:%L] -- %m%n" /><Policies><!-- 按天递计算频率 --><TimeBasedTriggeringPolicy interval="1" /><SizeBasedTriggeringPolicy size="500 MB" /><OnStartupTriggeringPolicy /></Policies><!-- 删除策略配置 --><DefaultRolloverStrategy max="5"><Delete basePath="logs/app/history" maxDepth="1"><IfFileName glob="*.log.gz"/><IfLastModified age="7d"/></Delete><Delete basePath="logs/app/history" maxDepth="1"><IfFileName glob="*.docx"/></Delete><Delete basePath="logs/app/history" maxDepth="1"><IfFileName glob="*.vsdx"/></Delete></DefaultRolloverStrategy></RollingFile><Async name="Async" bufferSize="2000" blocking="false"><AppenderRef ref="logFile"/></Async></Appenders><Loggers><Root level="${log_level}"><AppenderRef ref="Console" /><AppenderRef ref="Async" /></Root><!-- 配置个例 --><Logger name="com.xx.filter" level="info" /></Loggers></Configuration> 如果仅想停留在使⽤层⾯,如上log4j2.xml配置⽂件⾜矣! 不过,⾄少得注意⼀点,以上配置需要基于log4j2, ⽽如果你是 log4j1.x,则需要做下⽆缝升级:主要就是换下jar包版本,换个桥接包之类的,⽐如下参考配置:<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><!-- 桥接:告诉commons logging使⽤Log4j2 --><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>1.7.26</version></dependency><!-- 此处⽼版本,需注释掉 --><!--<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency>--><dependency><groupId>mons</groupId><artifactId>commons-compress</artifactId><version>1.10</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.8.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>2.8.2</version></dependency> 如果还想多了解⼀点其运⾏原理,就跟随本⽂的脚步吧:1.⾃动清理⼤体运⾏流程 ⾃动删除⼯作的运⾏原理⼤体流程如下。
log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j。
首先当然是得到log4j的jar档,推荐使用1.2.X版,下载地址:/log4j/1.2/download.html我们先看一个最简单的示例:【示例1】项目结构:【注:由于这里的多个项目公用一个jar档,我们可以创建一个专门放置jar档的Java工程,然后将jar档放到lib目录下。
在要使用的工程中按图所示进行引用】Java代码:Java代码1package com.coderdream.log4j;23import org.apache.log4j.Logger;45public class HelloLog4j {67private static Logger logger = Logger.getLogger(HelloLog4j.class);89/**10* @param args11*/12public static void main(String[] args) {13// System.out.println("This is println message.");1415// 记录debug级别的信息16logger.debug("This is debug message.");17// 记录info级别的信息("This is info message.");19// 记录error级别的信息20logger.error("This is error message.");21}22}配置文件log4j.properties:Properties代码23#可以设置级别:debug>info>error24#debug:显示debug、info、error25#info:显示info、error26#error:只error27log4j.rootLogger=debug,appender128#log4j.rootLogger=info,appender129#log4j.rootLogger=error,appender13031#输出到控制台32log4j.appender.appender1=org.apache.log4j.ConsoleAppender33#样式为TTCCLayoutyout=org.apache.log4j.TTCCLayout输出结果:Console代码35[main] DEBUG com.coderdream.log4j.HelloLog4j - This is debug message.36[main] INFO com.coderdream.log4j.HelloLog4j - This is info message.37[main] ERROR com.coderdream.log4j.HelloLog4j - This is error message. 通过配置文件可知,我们需要配置3个方面的内容:1、根目录(级别和目的地);2、目的地(控制台、文件等等);3、输出样式。
log4j升级log4j2遇到的问题及解决⽅式⽬录log4j升级log4j2的问题⼀、导⼊包⼆、在src/main/resources下新建⼀个log4j2.xml⽂件升级log4j2遇到的那些坑log4j升级log4j2的问题⼀、导⼊包<!-- log --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><!-- ⽇志桥接包,适配log4j2 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.8.2</version></dependency>注意:可能有些包需要依赖log4j,但是升级后只有log4j2了,此时会报找不到类的错,如:Caused by: ng.ClassNotFoundException: org.apache.log4j.Logger那么如果这些包没有使⽤slf4接⼝,⽽是写死了必须依赖log4j的话,如果实在不想导⼊log4j的包,那么只能找能代替这个包的⼯具包使⽤了如:<!-- 使⽤该报去掉log4j,后会报上述错误,所以就把这个包换了 --><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion></exclusions></dependency>替换为如下的包,就可以了:<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version><exclusions><exclusion><artifactId>log4j</artifactId><groupId>log4j</groupId></exclusion><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>⼆、在src/main/resources下新建⼀个log4j2.xml⽂件配置如下<?xml version="1.0" encoding="UTF-8" ?><configuration status="ERROR"><Properties><Property name="PATTERN" value="[%d{HH:mm:ss.SSS} %-5level] [%t] %c{3} - %msg%n" /><property name="FILE_PATH" value="/mySoft/logs" /><property name="FILE_SIZE" value="50 MB" /></Properties><Appenders><!-- 控制台⽇志打印 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="${PATTERN}"/></Console><!-- ⽣产环境⽇志打印 --><!-- fileName表⽰创建的⽇志⽂件名,filePattern表⽰如果⽇志策略按照⽇期与⼤⼩做限定的话,如果⼤⼩超过50m就会按该格式将之前的的⽇志⽂件重命名,并重新创建新的fileName。
springlog4j2.xml配置⽂件详解⼀、log4j2介绍 log4j 2.x版本不再⽀持像1.x中的.properties后缀的⽂件配置⽅式,2.x版本配置⽂件后缀名只能为".xml",".json"或者".jsn"。
配置⽂件的格式:log2j配置⽂件可以是xml格式的,也可以是json格式的。
配置⽂件的位置:log4j2默认会在classpath⽬录下寻找log4j2.xml、log4j.json、log4j.jsn等名称的⽂件。
系统选择配置⽂件的优先级(从先到后)如下: (1).classpath下的名为log4j2-test.json 或者log4j2-test.jsn的⽂件. (2).classpath下的名为log4j2-test.xml的⽂件. (3).classpath下名为log4j2.json 或者log4j2.jsn的⽂件. (4).classpath下名为log4j2.xml的⽂件. 我们⼀般默认使⽤log4j2.xml进⾏命名。
⼆、配置⽂件节点解析 (1).根节点Configuration有两个属性:status和monitorinterval,有两个⼦节点:Appenders和Loggers(表明可以定义多个Appender和Logger)。
status⽤来指定log4j本⾝的打印⽇志的级别。
monitorinterval⽤于指定log4j⾃动重新配置的监测间隔时间,单位是s,最⼩是5s。
(2).Appenders节点,常见的有三种⼦节点:Console、RollingFile、File。
Console节点⽤来定义输出到控制台的Appender。
name:指定Appender的名字. target:SYSTEM_OUT 或 SYSTEM_ERR,⼀般只设置默认:SYSTEM_OUT。
PatternLayout:输出格式,不设置默认为:%m%n。
log4j2 filepermission的使用Log4j2是一个强大的Java日志框架,可以帮助开发人员在应用程序中实现灵活和高效的日志记录。
其中一个重要的功能是文件权限管理,它可以帮助开发人员控制日志文件的访问权限,并保护敏感数据不被非授权人员获取。
文件权限管理在Log4j2中通过使用FilePermissions属性来实现。
FilePermissions属性是一个用于指定文件权限的字符串,它可以设置读、写和执行权限。
下面是一些常用的FilePermissions属性的示例:1. "rw-rw-rw-":所有用户都有读和写的权限,没有执行的权限。
2. "rwxr-x---":所有用户都有读、写和执行的权限,但其他用户没有读、写和执行的权限。
3. "rw-------":只有文件所有者有读和写的权限,其他用户没有任何的权限。
在Log4j2中,可以通过在配置文件中添加<Properties>元素来定义FilePermissions属性的值。
例如:```<Properties><Property name="filePermissions">rw-rw-rw-</Property></Properties>```此外,还可以通过使用系统属性来动态设置FilePermissions属性的值。
例如,可以在程序启动时设置System Property来指定FilePermissions属性的值。
下面是一个设置FilePermissions属性的示例:```javaSystem.setProperty("log4j2.filePermissions", "rw-rw-rw-");```设置FilePermissions属性后,Log4j2会将此属性应用到所有生成的日志文件上。
log4j2RollingRandomAccessFile配置过程log4j2 RollingRandomAccessFile配置⼀、需求背景1. ⽇志按⼩时压缩成zip⽂件。
2. 仅保存距离当前时间最近24⼩时的历史压缩⽂件。
3. 压缩封存的zip⽂件,按照零点为参考点纠偏。
4. 将com.roadway.acceptor.base.DebugUtils类的⽇志输出到指定⽂件,且不再输出到其他⽂件。
⼆、log4j2 配置实现<?xml version="1.0" encoding="UTF-8"?><Configuration status="INFO" monitorInterval="120"><properties><property name="MSG_LOG_HOME">/data/gpslog</property></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d [%t] %-5p [%c] - %m%n" /></Console><RollingRandomAccessFile name="msgAppender" immediateFlush="true"fileName="${MSG_LOG_HOME}/msg.log"filePattern="${MSG_LOG_HOME}/backup/msg.%d{yyyyMMddHH}.zip"><Filters><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/></Filters><PatternLayout pattern="%m%n" /><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/></Policies><DefaultRolloverStrategy max="24"><Delete basePath="${MSG_LOG_HOME}" maxDepth="2"><IfFileName glob="*/msg.*.zip" /><IfLastModified age="24H" /></Delete></DefaultRolloverStrategy></RollingRandomAccessFile></Appenders><Loggers><AsyncLogger name="com.roadway.DebugUtils" additivity="FALSE" level="INFO"><appender-ref ref="msgAppender" /></AsyncLogger></Loggers></Configuration>三、配置说明1. monitorInterval,博客配置的为120,单位为秒。
log4javascript是一个JavaScript日志记录库,它提供了强大的日志记录功能,可以帮助开发人员更好地跟踪和调试代码。
以下是log4javascript的使用手册:1. 安装log4javascript您可以通过npm安装log4javascript:```shellnpm install log4js```2. 引入log4javascript在您的JavaScript代码中,通过require()函数引入log4javascript:```javascriptvar log4js = require('log4js');```3. 创建logger对象使用log4javascript,您需要创建一个logger对象,以便记录日志:```javascriptvar logger = log4js.getLogger();```4. 设置日志级别通过设置logger的级别,您可以控制日志的输出。
log4javascript 支持6个级别,从低到高分别为:trace、debug、info、warn、error、fatal。
您可以通过以下方式设置级别:```javascriptlogger.level = 'debug';```5. 记录日志使用logger对象的方法,您可以记录不同级别的日志。
以下是记录不同级别日志的方法:* trace(String msg)* debug(String msg)* info(String msg)* warn(String msg)* error(String msg)* fatal(String msg)例如,要记录一条debug级别的日志,可以执行以下代码:```javascriptlogger.debug('This is a debug message');```6. 配置输出位置和控制台输出级别在默认情况下,log4javascript将日志输出到控制台。