log4j输出到文件和数据库

合集下载

log4j2异步日志原理

log4j2异步日志原理

log4j2异步日志原理
log4j2 是一个流行的 Java 日志框架,它支持异步日志记录。

log4j2 的异步日志原理主要涉及以下几个方面:
1. 异步日志队列,log4j2 使用 Disruptor(一种高性能的并发框架)作为异步日志队列,它能够高效地处理大量的日志事件。

当日志事件产生时,它会被放入 Disruptor 的环形队列中,而不会阻塞当前线程。

2. 异步日志 Appender,log4j2 的 Appender 是用来指定日志输出目的地的组件,异步日志 Appender 会从 Disruptor 队列中获取日志事件,并将其输出到指定的目的地,比如文件、数据库或控制台。

3. 异步日志配置,通过 log4j2 的配置文件,可以指定日志记录器(Logger)使用异步日志方式,这样日志事件会被放入Disruptor 队列中,而不会阻塞当前线程。

总的来说,log4j2 的异步日志原理是通过 Disruptor 队列实
现日志事件的异步处理,从而提高日志记录的性能和吞吐量。

这种机制能够在高并发环境下有效地降低日志记录对系统性能的影响。

log4j2工作原理

log4j2工作原理

log4j2工作原理
Log4j2是一个高效的日志管理工具,它使用异步记录日志信息并且具有高可配置性。

Log4j2的工作原理是通过Logger、Appender和Layout三个概念实现的。

Logger是Log4j2的核心组件,它用于记录日志信息。

Logger有一
个命名空间,可以有多个Logger实例,每个Logger实例都有一个日志级别。

当用户使用Logger实例记录一条日志时,Log4j2首先检查
这个日志的级别是否大于等于Logger实例的级别,如果是,则会将
日志信息封装成LogEvent对象,添加到异步队列中等待Appender
处理。

Appender是用于输出日志信息的组件,它可以将日志信息输出到控
制台、文件、数据库、远程服务器等目标。

每个Logger实例可以配
置多个Appender,当有日志信息需要输出时,Log4j2会遍历所有的Appender,将LogEvent对象传递给它们,从而实现日志信息的输出。

Layout用于格式化日志信息,它会将LogEvent对象转化为指定格式的字符串。

Log4j2内置了多种Layout,用户也可以自定义自己的Layout。

除了基本的Logger、Appender和Layout组件,Log4j2还有过滤器、异步队列和线程管理器等实用组件。

过滤器可以限制日志输出的条件,异步队列和线程管理器则用于处理请求和响应的线程。

总的来说,Log4j2通过Logger、Appender和Layout三个概念来实现高效的日志管理,它可以帮助用户记录更加详细的日志信息,提升
系统运维和故障排查的效率。

log4j 删除日志原理

log4j 删除日志原理

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的原理

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输出多个日志文件

log4j输出多个日志文件

log4j输出多个自定义日志文件log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。

先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:log4j.rootLogger=DEBUG, stdout, logfile.springframework=ERROR.apache=INFOlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%nlog4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.loglog4j.appender.logfile.MaxFileSize=512KBlog4j.appender.logfile.MaxBackupIndex=5yout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%n如果想对不同的类输出不同的文件(以.Test为例),先要在Test.java中定义:private static Log logger = LogFactory.getLog(Test.class);然后在log4j.properties中加入:.Test= DEBUG, testlog4j.appender.test=org.apache.log4j.FileAppenderlog4j.appender.test.File=${myweb.root}/WEB-INF/log/test.logyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%n也就是让.Test中的logger使用log4j.appender.test所做的配置。

软件开发中常用的日志工具及使用方法(四)

软件开发中常用的日志工具及使用方法(四)

软件开发中常用的日志工具及使用方法在软件开发过程中,日志记录是一项非常重要的任务。

日志记录可以帮助开发人员追踪和调试代码,同时也方便了系统管理员对系统运行状况进行监控。

为了更好地记录和利用日志信息,开发人员常常借助日志工具来完成这项任务。

本文将介绍一些常用的日志工具及其使用方法。

一、Log4jLog4j是一个Java日志记录工具。

它是Apache软件基金会的一个开源项目,已经成为了Java开发的事实标准。

Log4j提供了广泛的日志记录功能,可以将日志输出到控制台、文件、数据库等。

使用Log4j,开发人员可以根据需要设置不同的日志级别,从而过滤出不同重要性的日志信息。

此外,Log4j还支持通过配置文件进行日志管理,这使得开发人员可以在不修改代码的情况下进行日志相关的配置。

二、LogbackLogback是Log4j的改进版,是由Log4j的开发者Ceki Gülcü创建的。

它继承了Log4j的优点,并对其进行了一些改进和优化。

Logback的特点之一是速度快,它使用了异步日志记录来提高性能。

同时,Logback还支持动态配置,可以在运行时修改日志相关的配置,这使得开发人员可以更灵活地控制日志输出。

此外,Logback还提供了丰富的过滤器和转换器,可以对日志信息进行更加灵活的处理和转换。

三、ELK StackELK Stack是由三个开源工具Elasticsearch、Logstash和Kibana组成的日志管理平台。

Elasticsearch是一个分布式搜索和分析引擎,可以用来存储和查询大量的日志数据。

Logstash是一个日志收集和处理工具,可以从各种来源收集日志数据,并进行过滤、转换和存储。

Kibana是一个用于可视化和分析日志数据的工具,可以通过图表、仪表板等方式展示日志数据的统计信息。

ELK Stack的组合可以提供强大的日志管理和分析功能,帮助开发人员更好地理解和利用日志信息。

Mybatis日志配置文件

Mybatis日志配置文件

Mybatis⽇志配置⽂件log4j.properties#log4j⽇志级别如下:#A:off 最⾼等级,⽤于关闭所有⽇志记录。

#B:fatal 指出每个严重的错误事件将会导致应⽤程序的退出。

#C:error 指出虽然发⽣错误事件,但仍然不影响系统的继续运⾏。

#D:warn 表明会出现潜在的错误情形。

#E:info ⼀般和在粗粒度级别上,强调应⽤程序的运⾏全程。

#F:debug ⼀般⽤于细粒度级别上,对调试应⽤程序⾮常有帮助。

#G:all 最低等级,⽤于打开所有⽇志记录。

#但log4j只建议使⽤4个级别,优先级从⾼到低分别是:#error>warn>info>debuglog4j.rootLogger =debug,systemOut,logFile#输出到控制台log4j.appender.systemOut = org.apache.log4j.ConsoleAppenderyout = org.apache.log4j.PatternLayoutyout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%nlog4j.appender.systemOut.Target = System.out#输出到⽂件log4j.appender.logFile = org.apache.log4j.FileAppenderyout = org.apache.log4j.PatternLayoutyout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%nlog4j.appender.logFile.File = log/log4j.loglog4j.appender.logFile.Encoding = UTF-8#将⽇志输记录到MySQL数据库#log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender#yout = org.apache.log4j.PatternLayout#log4j.appender.logDB.Driver = com.mysql.jdbc.Driver#log4j.appender.logDB.URL = jdbc:mysql://localhost:3306/log4j?characterEncoding=utf-8#er = root#log4j.appender.logDB.Password = root#log4j.appender.logDB.Sql = INSERT INTO t_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('mybatis','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')⽇志⽂件输出⽅式有三种:输出到控制台,输出到⽂件,输出到数据库。

log4j2 原理

log4j2 原理

log4j2 原理Log4j2是Apache Log4j的升级版本,是一个可扩展的日志框架。

它提供了一套灵活的配置选项,可以满足各种日志需求,同时具有较高的性能。

Log4j2的原理可以总结为以下几个步骤:1. 配置加载:Log4j2通过解析配置文件(通常为XML或JSON格式)来获取日志系统的配置信息。

配置文件指定了日志的输出格式、输出位置、日志级别等细节。

Log4j2支持多种配置方式,包括配置文件、配置类和编程配置。

2. 日志记录:应用程序通过调用Log4j2提供的API来记录日志。

日志级别可以根据重要性从低到高分为TRACE、DEBUG、INFO、WARN、ERROR和FATAL。

Log4j2会根据日志级别过滤日志消息,只记录达到或超过指定级别的消息。

3. 日志输出:Log4j2根据配置文件中指定的输出位置,将日志消息输出到指定的目标,如控制台、文件、数据库或远程服务器。

Log4j2支持多种输出方式,包括ConsoleAppender、FileAppender、SocketAppender等。

4. 日志异步处理:为了提高性能,Log4j2采用异步处理机制。

它使用了多线程来处理日志消息,并通过队列机制将日志消息缓冲起来。

这样可以避免应用程序因为日志写入而阻塞。

5. 插件系统:Log4j2提供了丰富的插件系统,可以通过扩展插件来增加新的功能。

例如,可以添加自定义的Appender、Filter、Layout等组件,来实现特定的日志处理需求。

总的来说,Log4j2的工作流程是:加载配置文件,根据配置文件记录日志消息,根据配置文件将日志消息输出到指定的目标。

通过异步处理和插件系统,Log4j2能够提供高性能和灵活的日志功能。

log4日志的初始化流程

log4日志的初始化流程

log4日志的初始化流程
log4j是一个用于记录日志的Java库,它的初始化流程涉及到
配置文件的加载、日志级别的设置、输出目标的选择等多个方面。

下面我将从多个角度来详细解释log4j的初始化流程。

首先,log4j的初始化流程通常从配置文件的加载开始。

log4j
可以通过多种方式加载配置文件,包括使用默认的
log4j.properties文件或者通过编程方式指定配置文件的路径。


旦配置文件被加载,log4j会解析其中的配置信息,包括日志级别、输出目标、格式化方式等。

其次,配置文件中的日志级别设置是log4j初始化流程中的重
要部分。

日志级别决定了哪些日志信息会被记录,常见的日志级别
包括DEBUG、INFO、WARN、ERROR和FATAL。

在配置文件中,我们可
以通过设置不同的日志级别来控制日志记录的详细程度,从而满足
不同环境下的需求。

另外,输出目标的选择也是log4j初始化流程中的关键步骤。

log4j支持将日志信息输出到控制台、文件、数据库等不同的目标,我们可以通过配置文件来指定输出目标及其相关的参数,比如文件
路径、数据库连接信息等。

除此之外,log4j还支持日志信息的格式化输出,比如时间戳、日志级别、类名、线程名等信息都可以通过配置文件来进行格式化
设置。

总的来说,log4j的初始化流程涉及到配置文件的加载、日志
级别的设置、输出目标的选择以及日志信息的格式化输出等多个方面。

通过合理的配置,我们可以灵活地控制日志记录的行为,从而
更好地满足项目的需求。

idea log4j插件用法

idea log4j插件用法

1. 什么是Log4j插件Log4j是一个开源的日志记录框架,广泛应用于Java项目中。

Log4j插件是用于在开发过程中方便地使用Log4j框架的工具,能够帮助开发人员快速配置和管理日志记录功能。

2. Log4j插件的安装在使用Log4j插件之前,首先需要在开发环境中安装Log4j插件。

可以通过Maven或手动下载Jar包的方式将Log4j插件导入到项目中,然后在项目配置文件中声明Log4j插件的依赖关系。

3. Log4j插件的配置在项目中成功导入Log4j插件后,需要对插件进行配置。

首先需要创建一个Log4j配置文件(通常命名为log4j.properties或log4j.xml),在配置文件中指定日志记录的格式、输出目标、日志级别等参数。

4. 使用Log4j插件记录日志配置完成后,开发人员可以通过调用Log4j插件提供的API来记录日志。

开发人员可以在代码中插入日志记录语句,指定日志的级别(如DEBUG、INFO、WARN、ERROR等),以及日志的内容。

通过Log4j插件记录的日志可以输出到控制台、文件、数据库等不同的目标。

5. Log4j插件的优点Log4j插件提供了丰富的日志记录功能,可以根据需要灵活地配置日志记录的方式和输出目标。

Log4j插件具有较高的性能和稳定性,适用于各种规模的项目。

另外,Log4j插件支持多种日志级别,开发人员可以根据实际需要精细地控制日志的记录和输出。

6. Log4j插件的注意事项在使用Log4j插件的过程中,需要注意配置文件的正确指定和日志记录语句的合理使用。

对于不同的项目和需求,需要仔细选择适合的日志记录方式和输出目标,以便保证日志记录的准确性和便捷性。

7. 结语Log4j插件是一个优秀的日志记录工具,能够帮助开发人员轻松地实现日志记录的功能。

通过仔细的配置和合理的使用,开发人员可以充分发挥Log4j插件的优势,为项目提供有效的日志管理和追踪功能。

希望本文对大家了解Log4j插件的用法有所帮助。

log4j日志读取到数据库的方法

log4j日志读取到数据库的方法

在软件开发和系统运维中,日志是一个非常重要的组成部分。

它记录了系统的运行状态、错误信息、用户操作等各种信息,可以帮助开发人员和运维人员快速定位和解决问题,提高系统稳定性和可维护性。

log4j是一个用于记录日志的Java库,常用于企业级Java应用程序的日志记录。

而将log4j日志读取到数据库中,可以更好地对日志进行管理、分析和统计。

一、log4j日志读取到数据库的方法1. 配置log4j需要在log4j的配置文件中添加一个数据库追加器(appender),例如JDBCAppender。

该追加器可以将日志信息写入到指定的数据库表中。

需要指定数据库连接信息、表名、字段名等,以确保日志能够正确地写入到数据库中。

2. 编写数据库表在数据库中创建一个用于存储日志的表,通常包括日志记录时间、日志级别、日志内容等字段。

需要根据实际需求设计表结构,以满足日志的存储和查询需求。

3. 修改log4j配置文件在log4j的配置文件中,需要指定使用之前配置的JDBCAppender,并且配置日志输出的格式和级别。

也可以根据不同的情况定义不同的日志输出规则,以便将不同级别的日志信息写入到不同的数据库表中。

4. 编写日志处理类通常需要编写一个日志处理类,用于将log4j的日志信息转换成数据库表中的记录。

该类需要连接数据库,将日志信息写入到数据库对应的表中。

5. 测试需要进行测试,确保log4j能够正确地将日志信息写入到数据库中,并且能够通过数据库查询工具进行查询和分析。

测试可以包括记录不同级别的日志信息、异常信息等,以验证日志的写入和查询功能是否正常。

二、总结回顾通过以上方法,我们可以将log4j的日志信息写入到数据库中,以便更好地管理和分析日志信息。

这样可以帮助我们及时发现和解决系统中的问题,提高系统的稳定性和可维护性。

也可以通过数据库工具对日志信息进行统计和分析,以了解系统的运行状况和用户操作情况,为系统优化和改进提供数据支持。

log4j使用教程详解(怎么使用log4j2)

log4j使用教程详解(怎么使用log4j2)

log4j使⽤教程详解(怎么使⽤log4j2)1. 去官⽅下载log4j 2,导⼊jar包,基本上你只需要导⼊下⾯两个jar包就可以了(xx是乱七⼋糟的版本号):log4j-core-xx.jarlog4j-api-xx.jar2. 导⼊到你的项⽬中:这个就不说了。

3. 开始使⽤:我们知道,要在某个类中使⽤log4j记录⽇志,只需要申明下⾯的成员变量(其实不⼀定要是成员变量,只是为了⽅便调⽤⽽已)复制代码代码如下:private static Logger logger = LogManager.getLogger(MyApp.class.getName());⾥getLogger有⼀个参数指定的是这个logger的名称,这个名称在配置⽂件⾥⾯可是有需要的,这个待会⼉再说。

声明了Logger对象,我们就可以在代码中使⽤他了。

4. ⽇志的级别:我们现在要调⽤logger的⽅法,不过在这个Logger对象中,有很多⽅法,所以要先了解log4j的⽇志级别,log4j规定了默认的⼏个级别:trace<debug<info<warn<error<fatal等。

这⾥要说明⼀下:1)级别之间是包含的关系,意思是如果你设置⽇志级别是trace,则⼤于等于这个级别的⽇志都会输出。

2)基本上默认的级别没多⼤区别,就是⼀个默认的设定。

你可以通过它的API⾃⼰定义级别。

你也可以随意调⽤这些⽅法,不过你要在配置⽂件⾥⾯好好处理了,否则就起不到⽇志的作⽤了,⽽且也不易读,相当于⼀个规范,你要完全定义⼀套也可以,不⽤没多⼤必要。

3)这不同的级别的含义⼤家都很容易理解,这⾥就简单介绍⼀下:trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低⽇志级别不让他输出。

debug:调试么,我⼀般就只⽤这个作为最低级别,trace压根不⽤。

软件开发中常用的日志工具及使用方法(二)

软件开发中常用的日志工具及使用方法(二)

软件开发中常用的日志工具及使用方法在软件开发中,日志是一种非常重要的工具,它可以帮助开发人员记录程序运行时的各种信息,方便调试和排查问题。

本文将介绍一些常用的日志工具及其使用方法,希望对开发人员有所帮助。

1. 日志的作用在介绍具体的日志工具之前,我们先来了解一下日志的作用。

在软件开发过程中,由于各种原因,程序可能会出现各种错误和异常,如果没有日志记录,开发人员将很难定位和解决这些问题。

而有了日志记录,开发人员可以通过查看日志文件,了解程序在运行过程中的各种细节,从而更好地分析和解决问题。

2. Log4jLog4j是Apache软件基金会推出的一款开源的日志组件,它是Java开发中最常用的日志工具之一。

Log4j具有高度可定制化的特点,可以根据开发人员的需求,自定义日志输出格式、级别和目标等。

使用Log4j,开发人员只需简单地引入相关的依赖库,然后在代码中使用Logger对象进行日志记录即可。

3. LogbackLogback是Log4j日志组件的改进版本,它具有更高的性能和更多的功能特性。

Logback的配置文件可以轻松地实现对日志级别、输出格式、目标等的配置,同时还支持异步日志输出、多线程安全等特点。

与Log4j相比,Logback在功能和性能上都有明显的优势,因此在各种Java开发项目中广泛应用。

4. NLogNLog是针对.NET平台开发的一款开源日志组件,支持多种编程语言,如C#、等。

NLog提供了丰富的特性,包括分级日志、上下文日志、条件日志等。

同时,NLog还支持将日志输出到多种目标,如控制台、文本文件、数据库等。

在.NET开发中,NLog是一款非常方便和强大的日志工具。

5. ELK StackELK Stack是由Elastic公司推出的一套开源日志管理解决方案,它由Elasticsearch、Logstash和Kibana三个组件构成。

Elasticsearch是一个分布式搜索和分析引擎,负责日志的存储和索引;Logstash用于日志的收集、过滤和转换;Kibana则提供了强大的可视化工具,方便用户对日志数据进行搜索、统计和分析。

log4CXX第二篇---配置文件(properties文件)详解

log4CXX第二篇---配置文件(properties文件)详解

log4CXX第⼆篇---配置⽂件(properties⽂件)详解⼀、Log4j简介Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。

这⾥可简单理解为⽇志类别,⽇志要输出的地⽅和⽇志以何种形式输出。

综合使⽤这三个组件可以轻松地记录信息的类型和级别,并可以在运⾏时控制⽇志输出的样式和位置。

1、LoggersLoggers组件在此系统中被分为六个级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL。

这六个级别是有顺序的,分别⽤来指定这条⽇志信息的重要程度,明⽩这⼀点很重要,Log4j有⼀个规则:只输出级别不低于设定级别的⽇志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的⽇志信息都会输出,⽽级别⽐INFO低的DEBUG则不会输出。

2、Appenders禁⽤和使⽤⽇志请求只是Log4j的基本功能,Log4j⽇志系统还提供许多强⼤的功能,⽐如允许把⽇志输出到不同的地⽅,如控制台(Console)、⽂件(Files)等,可以根据天数或者⽂件⼤⼩产⽣新的⽂件,可以以流的形式发送到其它地⽅等等。

常使⽤的类如下:org.apache.log4j.ConsoleAppender(控制台)org.apache.log4j.FileAppender(⽂件)org.apache.log4j.DailyRollingFileAppender(每天产⽣⼀个⽇志⽂件)org.apache.log4j.RollingFileAppender(⽂件⼤⼩到达指定尺⼨的时候产⽣⼀个新的⽂件)org.apache.log4j.WriterAppender(将⽇志信息以流格式发送到任意指定的地⽅)配置模式:log4j.appender.appenderName = classNamelog4j.appender.appenderName.Option1 = value1…log4j.appender.appenderName.OptionN = valueN3、Layouts有时⽤户希望根据⾃⼰的喜好格式化⾃⼰的⽇志输出,Log4j可以在Appenders的后⾯附加Layouts来完成这个功能。

Java日志框架对比:Log4j、Logback和SLF4J的选择

Java日志框架对比:Log4j、Logback和SLF4J的选择

Java日志框架对比:Log4j、Logback和SLF4J的选择引言:在开发Java应用程序时,日志是一个非常重要的组成部分。

它可以帮助我们记录应用程序的运行状态、调试问题以及监控系统性能。

为了更好地管理和利用日志信息,我们需要选择一个适合的日志框架。

本文将对比三个流行的Java日志框架:Log4j、Logback和SLF4J,帮助读者了解它们的特点和适用场景,以便做出正确的选择。

一、Log4jLog4j是一个广泛使用的Java日志框架,它提供了强大的日志记录功能和灵活的配置选项。

Log4j具有以下几个主要特点:1. 简单易用:Log4j的API设计简单直观,容易上手。

开发人员可以通过几行代码快速集成Log4j到应用程序中,并开始记录日志。

2. 高度可配置:Log4j提供了丰富的配置选项,可以根据需求灵活地配置日志输出格式、日志级别、目标设备等。

这使得开发人员可以根据具体需求进行精细化的日志管理。

3. 强大的过滤器机制:Log4j支持多种过滤器,可以根据日志的级别、来源、内容等进行过滤,从而实现对日志信息的精确控制。

4. 多种输出方式:Log4j支持将日志输出到控制台、文件、数据库等多种目标设备,开发人员可以根据实际需求选择合适的输出方式。

尽管Log4j在过去是Java日志领域的翘楚,但它的维护和更新已经相对较少。

因此,随着时间的推移,Log4j的性能和功能可能无法满足现代应用程序的需求。

二、LogbackLogback是由Log4j的创始人开发的下一代Java日志框架,它在Log4j的基础上进行了改进和优化。

Logback具有以下几个主要特点:1. 高性能:相比于Log4j,Logback在性能上有了显著提升。

它通过精细的设计和优化,可以更高效地处理日志记录,减少对应用程序性能的影响。

2. 灵活的配置:Logback提供了与Log4j相似的配置选项,可以根据需要自定义日志输出格式、级别、目标设备等。

log4g.property文件解析

log4g.property文件解析

log4j.properties 是Log4j 日志框架中的配置文件,用于配置日志的输出方式、级别、格式等。

下面是对log4j.properties 文件的解析说明:基本语法:以# 开头的行表示注释。

使用键值对的形式配置属性,例如key = value。

属性可以根据需求进行多行配置,使用反斜杠\ 进行换行。

常用配置属性:log4j.rootLogger:设置默认的根日志级别。

log4j.appender:定义日志的输出目的地,可以是控制台、文件等。

log4j.logger:指定特定包或类的日志级别。

log4j.additivity:设置是否将日志传递给父级logger。

yout:定义日志的格式,如日期、日志级别、类名等。

日志级别(Level):ALL:最低级别,打开所有日志记录。

DEBUG:调试级别,用于调试信息。

INFO:信息级别,用于记录程序运行信息。

WARN:警告级别,用于非致命性的异常情况。

ERROR:错误级别,用于可恢复的错误情况。

FATAL:严重错误级别,用于无法恢复的错误情况。

OFF:最高级别,关闭所有日志记录。

Appender(输出器):ConsoleAppender:将日志输出到控制台。

FileAppender:将日志输出到文件。

RollingFileAppender:将日志输出到滚动文件,可设置文件大小和数量限制。

DailyRollingFileAppender:将日志输出到按日期滚动的文件。

SocketAppender:将日志输出到网络套接字。

JDBCAppender:将日志输出到数据库。

示例配置:log4j.rootLogger=DEBUG, console, file# 控制台输出配置log4j.appender.console=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d [%-5p] %c - %m%n# 文件输出配置log4j.appender.file=org.apache.log4j.RollingFileAppenderlog4j.appender.file.File=/path/to/logfile.loglog4j.appender.file.MaxFileSize=5MBlog4j.appender.file.MaxBackupIndex=10yout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d [%-5p] %c - %m%n以上是对log4j.properties 文件的简要解析,根据实际需求和日志框架的版本,配置文件的具体内容可能会有所差异。

使用Log4j如何实现分级输出

使用Log4j如何实现分级输出

log4j日志分级输出到不同文件的配置基础:log4j的配置项说明:log4j总共有6中级别,从高到低分别为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。

Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

其中:DEBUG Level 指出细粒度信息事件对调试应用程序是非常有帮助的。

INFO level表明消息在粗粒度级别上突出强调应用程序的运行过程。

WARN level表明会出现潜在错误的情形。

ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。

FATAL level指出每个严重的错误事件将会导致应用程序的退出。

ALL Level是最低等级的,用于打开所有日志记录。

OFF Level是最高等级的,用于关闭所有日志记录。

# log4j.rootLogger中配置的ERROR,表示一下配置的所有配置的级别的起点为:ERROR。

即只能显示、存储ERROR以及ERROR以上级别的日志# 若在此配置了ERROR,下边配置了INFO级别的日志要存储在指定的文件中,实际是不会存储的# 若配置INFO级别的日志存在文件1中,ERROR级别的文件,存在文件2中,# 若有个ERROR的日志的话,两个文件都是可以存储的;若有个INFO 级别的文件的话,则只有文件1会存储该日志,文件2是不会存储的日志的输出格式配置:# %m 输出代码中指定的消息#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL #%r 输出自应用启动到输出该log信息耗费的毫秒数#%c 输出所属的类目,通常就是所在类的全名#%t 输出产生该日志事件的线程名#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日22 :10 :28 ,921#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。

log4j info 参数

log4j info 参数

log4j info 参数Log4j是一个用于记录日志的Java库,它提供了丰富的功能和灵活的配置选项。

在使用Log4j时,我们可以使用不同的日志级别来控制日志输出的详细程度。

其中,info级别是一种常用的日志级别,用于输出重要的信息,帮助我们了解系统的运行状况和关键事件的发生情况。

在使用Log4j进行日志记录时,我们需要设置相应的参数来定义日志输出的格式、位置和级别等。

下面,我将介绍一些常用的Log4j info参数,帮助大家更好地理解和使用Log4j。

1. 日志级别:在Log4j中,共定义了7个日志级别,从低到高分别是:TRACE、DEBUG、INFO、WARN、ERROR、FATAL和OFF。

其中,INFO 级别用于输出重要的信息,帮助我们了解系统的运行状况。

通过设置日志级别,我们可以控制日志输出的详细程度,避免过多或过少的日志输出。

2. 日志格式:Log4j允许我们自定义日志输出的格式,以满足不同的需求。

常用的日志格式包括:简单格式、详细格式和自定义格式。

简单格式适用于普通的日志输出,包含时间、日志级别和日志内容等基本信息。

详细格式适用于需要更详细信息的日志输出,包含线程名称、类名和方法名等额外信息。

自定义格式可以根据自己的需求来定义日志输出的格式,灵活性更高。

3. 日志输出位置:Log4j允许我们将日志输出到不同的位置,如控制台、文件、数据库等。

通过设置不同的参数,我们可以灵活地控制日志输出的位置和方式。

一般来说,将日志输出到文件是比较常用的方式,可以方便地进行查看和分析。

4. 日志滚动:当日志文件达到一定大小或时间时,Log4j可以自动滚动日志文件,以便于管理和维护。

通过设置相应的参数,我们可以控制日志滚动的条件和方式。

常见的日志滚动方式包括按文件大小、按日期和按文件数量等。

5. 日志异步:为了提高系统的性能,Log4j提供了日志异步输出的功能。

通过将日志输出的过程放入一个独立的线程中进行处理,可以减少日志输出对系统性能的影响。

JAVAlog4j同一个类日志输出到不同的log文件中配置

JAVAlog4j同一个类日志输出到不同的log文件中配置

JAVAlog4j同一个类日志输出到不同的log文件中配置不能通过简单的配置log4j配置文件来实现,而需要在代码中调用Log4j的类来实现。

下面给出实现类:/** * @author QG * * 2010-7-22 上午10:27:50 LoggerRun.java */public class LoggerRun { //设定两个Logpublic static Logger infoLogger = Logger.getLogger("info.logger");public static Logger errorLogger = Logger.getLogger("error.logger");public static final String PROFILE = "log4j.properties";//设定异常log输出的路径private static final String PATH = Constants.PATH;static{try{URL configFileResource = (new File(LoggerRun.class.getResource("/").getPath()+PROFILE)).toUR L();PropertyConfigurator.configure(configFileResource);}catch(Exception e){e.printStackTrace();}}public LoggerRun(){try {Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmmss");String fileName = PATH + "exception_" +sf.format(date).toString() + ".log";FileAppender exceptionAppender = new FileAppender(new SimpleLayout(), fileName);errorLogger.addAppender(exceptionAppender);} catch (Exception e) {e.printStackTrace();}}}同时给出配置文件配置信息:.logger=INFO, info,stdoutlog4j.category.error.logger=ERROR,errorlog4j.appender.stdout=org.apache.log4j.ConsoleAppender yout=org.apache.log4j.PatternLayo utyout.ConversionPattern=%d{yyyy/ MM/dd HH:mm:ss.SSS} %-5p %m%=org.apache.log4j.RollingFileAppe nder.File=bin/log/info.log.MaxFileSize=100kb.MaxBackupIndex=4yout=org.apache.log4j.PatternLayout yout.ConversionPattern=%d{yyyy/MM /dd HH:mm:ss.SSS} %-5p %m%nlog4j.appender.error=org.apache.log4j.RollingFileApp enderlog4j.appender.error.File=bin/log/error.loglog4j.appender.error.MaxFileSize=100kblog4j.appender.error.MaxBackupIndex=4yout=org.apache.log4j.PatternLayout yout.ConversionPattern=%d{yyyy/M M/dd HH:mm:ss.SSS} %-5p %m%n在给出测试类:public class TestLog {public static final Logger logger=Logger.getLogger(T estLog.class);/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0;i<10;i++){if(i<5){("TEST The Logger DUBUG");}else{LoggerRun.errorLogger.error("TEST THe LOGGER ERROR");}}}}同一个类中的日志按类型输出到了不同的日志文件中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

log4j输出到文件和数据库控制台的实现就不说了,这里提供两种实例的配置,一种是输出为文件的(每天输出一个文件),一种为输出到数据库的配置。

1、输出到文件:Properties代码log4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILElog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern='.'yyyy-MM-dd'.html'yout=com.surfilter.bt.util.FormatHTMLLayoutlog4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILElog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern='.'yyyy-MM-dd'.html'yout=com.surfilter.bt.util.FormatHTMLLayout这里的com.surfilter.bt.util.FormatHTMLLayout是重写了log4j提供的HTMLLayout类,具体代码如下:Java代码import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import yout;import org.apache.log4j.Level;import org.apache.log4j.helpers.Transform;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;import com.opensymphony.xwork2.ActionContext;import com.surfilter.core.Constants;import er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br>&nbsp;&nbsp;&nbsp;&nbsp;";// output buffer appended to when format() is invokedprivate StringBuffer sbuf = new StringBuffer(BUF_SIZE);String title="系统操作日志";/*** A string constant used in naming the option for setting the the HTML* document title. Current value of this string constant is <b>Title</b>.*/public static final String TITLE_OPTION = "Title";// Print no location info by defaultboolean locationInfo = true;public String format(LoggingEvent event) {if (sbuf.capacity() > MAX_CAPACITY) {sbuf = new StringBuffer(BUF_SIZE);} else {sbuf.setLength(0);}sbuf.append(Layout.LINE_SEP + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(newjava.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td>&nbsp;</td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + Layout.LINE_SEP);}return sbuf.toString();}private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {if (s != null) {int len = s.length;if (len == 0)return;sbuf.append(Transform.escapeTags(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import yout;import org.apache.log4j.Level;import org.apache.log4j.helpers.Transform;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;import com.opensymphony.xwork2.ActionContext;import com.surfilter.core.Constants;import er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br>&nbsp;&nbsp;&nbsp;&nbsp;";// output buffer appended to when format() is invokedprivate StringBuffer sbuf = new StringBuffer(BUF_SIZE);String title="系统操作日志";/*** A string constant used in naming the option for setting the the HTML * document title. Current value of this string constant is <b>Title</b>.*/public static final String TITLE_OPTION = "Title";// Print no location info by defaultboolean locationInfo = true;public String format(LoggingEvent event) {if (sbuf.capacity() > MAX_CAPACITY) {sbuf = new StringBuffer(BUF_SIZE);} else {sbuf.setLength(0);}sbuf.append(Layout.LINE_SEP + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td>&nbsp;</td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + Layout.LINE_SEP);}return sbuf.toString();}private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {if (s != null) {int len = s.length;if (len == 0)return;sbuf.append(Transform.escapeTags(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}注,上面输出里包含了从当前session里取到的用户信息,只需要重写getHeader,format,appendThrowableAsHTML三个方法就可以了。

相关文档
最新文档