log4j学习
log4j如同Hadoop一样,把需要的jar包(hadoop.jar )和配置文件,放到CLASSPATH中,配置Log4j也要如此,把log4j-1.2.8.jar,log4j.properties放到classpath中。
配置文件配置的是Log输出到哪里,如何输出,何时输出,哪些类的log要输出(等级)(Where,How,When,Who)代码中用到的 private final Log log = LogFactory.getLog(getClass());得到类的全名,Log4j框架就会去找相应的package是否有设置输出log,以及它的等级。
如果等级为DEBUG那么log.isDebugEnabled()为true。
如下所示,如果等级为INFO,那么log.isInfoEnabled()、log.isWarnEnabled()、log.isErrorEnabled()这三个为true,其他的为false?(有待确认)等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。
if (log.isDebugEnabled()){log.debug("111");}if (log.isInfoEnabled()){("222");}完整的文章如下:在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日志操作类外,Apache为我们提供了一个强有力的日志操作包-Log4j。
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言分布式系统得到一个统一一致的日志组件模块。
而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。
说明:下面分为三部分,第一部分讲解如何配置log4j;第二部分为对log4j.properties配置文件中的各个属性的讲解;第三部分为对log4j的详细讲解。
如果只想配置上log4j,那么只需要看前两个部分就可以,如果想对log4j深入了解,则还需看第三部分。
一、Log4j配置第一步:加入log4j-1.2.8.jar到lib下。
第二步:在CLASSPATH下建立log4j.properties。
内容如下:1 log4j.rootCategory=INFO, stdout , R23 log4j.appender.stdout=org.apache.log4j.ConsoleAppender4 yout=org.apache.log4j.PatternLayout5 yout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n67 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender8 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log9 yout=org.apache.log4j.PatternLayout10 yout.ConversionPattern=%d-[TS] %p %t %c - %m%n1112 .neusoft=DEBUG13 .opensymphony.oscache=ERROR14 .sf.navigator=ERROR15 mons=ERROR16 .apache.struts=WARN17 .displaytag=ERROR18 .springframework=DEBUG19 .ibatis.db=WARN20 .apache.velocity=FATAL2122 .canoo.webtest=WARN2324 .hibernate.ps.PreparedStatementCache=WARN25 .hibernate=DEBUG26 .logicalcobwebs=WARN第三步:相应的修改其中属性,修改之前就必须知道这些都是干什么的,在第二部分讲解。
第四步:在要输出日志的类中加入相关语句:定义属性:protected final Log log = LogFactory.getLog(getClass());在相应的方法中:if (log.isDebugEnabled()){log.debug(“System …..”);}二、Log4j说明1 log4j.rootCategory=INFO, stdout , R此句为将等级为INFO的日志信息输出到stdout和R这两个目的地,stdout和R的定义在下面的代码,可以任意起名。
等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示,具体讲解可参照第三部分定义配置文件中的logger。
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender此句为定义名为stdout的输出端是哪种类型,可以是org.apache.log4j.ConsoleAppender(控制台),org.apache.log4j.FileAppender(文件),org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)具体讲解可参照第三部分定义配置文件中的Appender。
4 yout=org.apache.log4j.PatternLayout此句为定义名为stdout的输出端的layout是哪种类型,可以是org.apache.log4j.HTMLLayout(以HTML表格形式布局),org.apache.log4j.PatternLayout(可以灵活地指定布局模式),org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)具体讲解可参照第三部分定义配置文件中的Layout。
5 yout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:%m 输出代码中指定的消息%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL%r 输出自应用启动到输出该log信息耗费的毫秒数%c 输出所属的类目,通常就是所在类的全名%t 输出产生该日志事件的线程名%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。
[QC]是log信息的开头,可以为任意字符,一般为项目简称。
输出的信息[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'具体讲解可参照第三部分定义配置文件中的格式化日志信息。
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender此句与第3行一样。
定义名为R的输出端的类型为每天产生一个日志文件。
8 log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log此句为定义名为R的输出端的文件名为D:\\Tomcat 5.5\\logs\\qc.log可以自行修改。
9 yout=org.apache.log4j.PatternLayout与第4行相同。
10 yout.ConversionPattern=%d-[TS] %p %t %c - %m%n与第5行相同。
12 . neusoft =DEBUG指定com.neusoft包下的所有类的等级为DEBUG。
可以把com.neusoft改为自己项目所用的包名。
13 .opensymphony.oscache=ERROR14 .sf.navigator=ERROR这两句是把这两个包下出现的错误的等级设为ERROR,如果项目中没有配置EHCache,则不需要这两句。
15 mons=ERROR16 .apache.struts=WARN这两句是struts的包。
17 .displaytag=ERROR这句是displaytag的包。
(QC问题列表页面所用)18 .springframework=DEBUG此句为Spring的包。
24 .hibernate.ps.PreparedStatementCache=WARN25 .hibernate=DEBUG此两句是hibernate的包。
以上这些包的设置可根据项目的实际情况而自行定制。
三、log4j详解1、定义配置文件Log4j支持两种配置文件格式,一种是XML格式的文件,一种是Java特性文件log4j.properties(键=值)。
下面将介绍使用log4j.properties文件作为配置文件的方法:①、配置根LoggerLogger 负责处理日志记录的大部分操作。
log4j文件切分规则
log4j文件切分规则一、引言log4j是一个Java日志框架,方便开发者记录应用程序的运行日志并进行管理。
在使用log4j时,我们可以通过配置文件来定义日志的输出方式和切分规则。
本文将重点讨论log4j文件切分规则。
二、按文件大小切分在日志文件的切分规则中,按文件大小切分是最常见的一种方式。
通过配置log4j,我们可以设置一个文件的最大大小,当该文件达到最大大小时,log4j会自动将其备份,并创建一个新的日志文件来记录日志。
这种方式可以确保每个日志文件不会过大,方便查阅和管理。
三、按日期切分除了按文件大小切分,log4j还支持按日期切分日志文件。
通过设置切分的时间间隔,log4j会在指定的时间点自动将当前日志文件备份,并创建一个新的日志文件来记录后续的日志信息。
这种方式可以按照日期来管理日志文件,方便按照时间段进行查阅。
四、按文件数量切分除了按文件大小和日期切分,log4j还支持按文件数量切分日志文件。
通过设置切分的文件数量,当日志文件数量达到指定值时,log4j会自动将最早的日志文件备份,并创建一个新的日志文件来记录新的日志信息。
这种方式可以保持日志文件数量的稳定,避免文件过多导致管理困难。
五、动态切分规则在log4j中,我们可以通过配置动态切分规则来灵活地管理日志文件。
例如,我们可以根据业务需求,定义不同的切分规则,如按照不同的模块或日志级别进行切分。
这样可以根据具体的需求来管理日志文件,使日志信息更加有意义和可读性。
六、配置示例下面是一个示例的log4j配置文件,展示了如何设置文件切分规则:```log4j.rootLogger=INFO, filelog4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=/path/to/log/file.loglog4j.appender.file.MaxFileSize=10MBlog4j.appender.file.MaxBackupIndex=10yout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n```在上述配置中,我们定义了一个名为file的appender,它是一个RollingFileAppender。
log4j 漏洞原理
log4j 漏洞原理
log4j是一个流行的日志框架,它提供了丰富的日志输出方式和配置选项。
然而,最近爆出了一个严重的漏洞,被命名为
log4shell,它允许攻击者远程执行任意代码,甚至获取系统权限。
该漏洞的原理是利用 log4j 的 JNDI 功能,通过构造特殊的日志消息,在服务器上触发 JNDI 查询并加载远程服务器上的恶意代码。
攻击者可通过控制恶意服务器上的代码,获取系统权限或执行任意命令,造成极大的危害。
受影响的版本包括 log4j 2.0-beta9 至 2.14.1,建议尽快升级至最新版本。
同时,可以通过禁用 JNDI 功能或限制 JNDI 查询的范围等方式,降低风险。
该漏洞已被广泛利用,各大厂商也纷纷发布了安全补丁。
作为开发者和系统管理员,我们需要及时关注并采取相应措施,确保系统安全。
- 1 -。
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 设置为保存一个备份文件。
log4j基本使用方法
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
FileAppender Threshold ImmediateFlush File
设置日志消息的初始级别 设置日志信息是否立即输出,默认为true 设置输出的文本 默认值是true,新增文件内容是否覆盖原 有内容,false为覆盖
org.apache.log4j.PatternLayout 可以灵活地指定布局模式 ConversionPattern=%m%n :指定怎样格式化指定的消息.
占位符参考log4j API
org.apache.log4j.SimpleLayout
包含日志信息的级别和信息字符串,内 置的简单布局没有提供自定义设置 包含日志产生的时间,线程,类别等等 信息
Append
DailyRollingFileAppender DatePattern的格式符 的格式符 Threshold '.'yyyy-MM
设置日志消息的初始级别 每月
#在配置文件中设置: '.'yyyy-ww 每周 ImmediateFlush 设置日志信息是否立即输出,默认为true #设置为每月输出 log4j.appender.MyAppenderName.DatePattern = '.'yy-MM '.'yyyy-MM-dd 每天 //在程序中使用 设置输出的文本 File //设置为每月输出 '.'yyyy-MM-dd-a 每天两次 myFile. setDatePattern ("'.true,新增文件内容是否覆盖原 '.'yyyy-MM-dd-HH 每小时 有内容,false为覆盖
log4j的原理
log4j的原理log4j是一个Java编程语言的日志记录框架,它是Apache软件基金会的一个项目。
log4j的主要目的是为应用程序提供一种简单灵活的方法来记录日志。
它支持多个输出方式,可以将日志信息输出到控制台、文件、数据库等不同的目标。
以下是log4j的原理。
1. Logger:log4j的核心组件是Logger,它负责记录日志信息。
Logger对象用于应用程序中,通过它可以创建不同的记录器。
记录器是log4j的实例,主要用于记录特定类或特定模块的日志信息。
2. Appender:Appender是Logger的附加组件,它用于指定日志信息的输出目标。
log4j支持多种Appender,包括ConsoleAppender(输出到控制台)、FileAppender(输出到文件)、JDBCAppender(输出到数据库)等。
通过配置文件,可以指定将日志信息输出到一个或多个Appender。
3. Layout:Layout用于指定日志记录的格式。
log4j提供多种Layout,包括简单的文本格式、HTML格式、XML格式等。
通过配置文件,可以选择适合自己需求的Layout,并将其与Appender关联起来。
4. Level:Level用于定义日志信息的严重程度。
log4j提供6种Level,从低到高分别是TRACE、DEBUG、INFO、WARN、ERROR和FATAL。
通过配置文件,可以为每个Logger指定不同的Level。
当日志信息的Level高于或等于Logger的Level时,才会被记录。
5. Filter:Filter用于过滤日志信息。
log4j支持多种Filter,包括DenyAllFilter(拒绝所有日志信息)、LevelRangeFilter(限制日志级别范围)、StringMatchFilter(匹配字符串过滤器)等。
通过配置文件,可以为每个Logger指定一个或多个Filter,用于过滤不符合条件的日志信息。
log4j中logger标签中additivity属性的用法说明
log4j中logger标签中additivity属性的⽤法说明⽬录log4j logger标签中additivity属性log4j.additivity⽤法和例⼦log4j logger标签中additivity属性将logger中的 additivity 属性配置为 false,则这个logger不会将⽇志流反馈到root中。
可以达到以logger中配置的appender⽅式来输出⽇志⽽其他地⽅输出的⽬的,看配置:< appender name = "DEMO" class = "com.XXXXX.RollingFileAppender" >< param name = "file" value = "${loggingRoot}/xxx.log" />< param name = "append" value = "true" />< param name = "encoding" value = "GB2312" />< param name = "threshold" value = "info" />< param name = "MaxFileSize" value = "50MB" />< param name = "MaxBackupIndex" value = "10" />< layout class = "org.apache.log4j.PatternLayout" >< param name = "ConversionPattern" value = "%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n" /></ layout ></ appender >< logger name = "XXXX.XXXX.XXXX" additivity = "false" >< level value = "${loggingLevel}" />< appender-ref ref = "DEMO" /></ logger >root的作⽤是收集下⾯所有反馈上来的信息流并根据配置在root中appender进⾏输出,只要你在looger中配置了additivity="false",就不会反馈到root中。
log4j2中文手册
Log4j2使用手册一.Log4j2介绍Log4j1.x 被广泛应用于应用程序,但是近年发展明显放缓,因为要维持较老java版本的使用,使得log4j1.x 的发展更困难。
而作为其代替品,slf4j/logback 做出了许多必要改进,为什么还需要log4j2? 主要有以下几个原因: (1)Log4j2被设计用作审计日志框架, log4j 和logback 在重载配置时,都会丢失日志时间,而log4j2不会。
Logback中appenders中的异常对于应用来说是不可见的,log4j2可以配置异常向应用渗透。
(2)Log4j2 包含基于LMAX Disruptor library的下一代无锁Asynchronous Loggers ,在多线程环境下,Asynchronous Loggers 相比slf4j / logback 提高了10倍以上的吞吐量,并且有着更低的延时。
(3)Log4j2的插件机制,使得在不需要修改框架的情况下,通过添加 Appenders, Filters, Layouts, Lookups 轻松扩展框架。
(4)简单的插件配置,无需指定具体类名即可在configuration 中配置插件。
(5)支持自定义日志级别,可以在代码或者configuration 中自定义日志级别。
(6)支持lambda表达式,java8的应用可以在请求日志级别启用时使用lambda表达式懒构建一个日志消息,不需要显示的日志级别检查,使得代码更简洁。
(7)支持消息对象,消息允许支持有趣和复杂的结构,传递到日志记录系统,并且可以高效的操作。
用户可以自由创建消息类型和编写Layouts, Filters and Lookups 来操作这些消息。
(8)Log4j1在Appenders 上支持Filters。
logback增加了TurboFilters,允许在日志事件在处理前进行过滤。
Log4j2可以配置Filters 在Logger后者Appender 前运行。
log4j2 rce原理
log4j2 rce原理
Log4j是一个Java日志管理框架,用于生成和管理日志信息。
Log4j 2.x版本中存在一个远程代码执行(RCE)漏洞,该漏洞允许攻击者通过构造恶意的日志请求触发远程代码执行,可能导致服务器被入侵或者影响应用程序的安全性。
Log4j的RCE漏洞主要是由于Log4j使用了一种能够远程加载类的功能,被称为JNDI Lookup。
JNDI是Java命名和目录接口的一部分,它允许Java应用程序通过名称访问和获取远程对象。
攻击者可以通过恶意构造的JNDI Lookup请求来触发远程代码执行。
具体来说,攻击者可以在日志配置中使用特殊的URL 来引用一个远程服务器,然后该远程服务器返回一个恶意类实例。
当Log4j收到恶意的日志请求时,它会尝试解析配置中的URL,然后从远程服务器获取类,并执行其中的代码。
这样,攻击者就可以通过构造恶意的日志请求,来利用Log4j的远程代码执行漏洞。
攻击者可以利用远程代码执行漏洞实现远程命令执行、文件读取、文件上传等恶意操作。
通过将恶意代码作为类实例返回给Log4j并执行,攻击者可以完全控制受影响的系统。
为了防止此漏洞,建议升级到log4j的最新版本。
此外,还可
以通过禁用Log4j的JNDI Lookup功能来缓解风险,具体方法可以参考相关安全公告和建议。
log4j中文手册
Log4j手册文档版本:1.1编者:陈华联系方式:clinker@发布日期:2006年4月5日1. 简介 (1)1. 简介 (3)1.1 概述 (3)1.2 主要组件 (3)2. Logger (4)2.1 层次结构 (4)2.2 输出级别 (5)3. Appenders (7)3.1 概念说明 (7)3.2 Appender的配置 (7)3.3 Appender的添加性 (8)4. Layouts (8)4.1 概念说明 (8)4.2 Layout的配置 (9)5. 配置 (10)6. 默认的初始化过程 (13)7. 配置范例 (14)7.1 Tomcat (14)8. Nested Diagnostic Contexts (14)9. 优化 (15)9.1 日志为禁用时,日志的优化 (15)9.2 当日志状态为启用时,日志的优化 (16)9.3 日志信息的输出时,日志的优化 (16)10. 总结 (16)11. 附录 (17)11.1 参考文档 (17)11.2 比较全面的配置文件 (17)11.3 日志乱码的解决 (19)1. 简介1.1 概述程序开发环境中的日志记录是由嵌入在程序中以输出一些对开发人员有用信息的语句所组成。
例如,跟踪语句(trace),结构转储和常见的System.out.println或printf调试语句。
log4j提供分级方法在程序中嵌入日志记录语句。
日志信息具有多种输出格式和多个输出级别。
使用一个专门的日志记录包,可以减轻对成千上万的System.out.println语句的维护成本,因为日志记录可以通过配置脚本在运行时得以控制。
log4j维护嵌入在程序代码中的日志记录语句。
通过规范日志记录的处理过程,一些人认为应该鼓励更多的使用日志记录并且获得更高程度的效率。
1.2 主要组件Log4j有三个主要组件: loggers、appenders和layouts。
这三个组件协同工作,使开发人员能够根据消息类型和级别来记录消息,并且在程序运行期控制消息的输出格式位置。
