- 浏览: 397898 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (760)
- 股票日志 (26)
- Selenium (0)
- selenium 2 环境的搭建 (1)
- 并发 (7)
- 框架开发 (1)
- 动态代理 (2)
- Struts2 (2)
- POI (2)
- jdk (3)
- maven (31)
- spring (35)
- mysql (31)
- 工作机会 (3)
- xtream (1)
- oracle dbms_metadata GET_DDL (0)
- SSI (1)
- DB (61)
- powermock (4)
- java 基础 (25)
- 多线程 (11)
- 高手 (2)
- java 底层 (2)
- 专业网站 (1)
- 开发联想 (1)
- 开发联想 (1)
- bat文件 (2)
- 清queue 语句 (1)
- 清queue 语句 (1)
- jquery (7)
- html5 (1)
- Jenkins (10)
- Linux (17)
- 工作issue (2)
- tomcat log (3)
- jvm (23)
- 项目细节 (0)
- oracle (41)
- 泛型 (3)
- 新知识点 (1)
- 数据库ddl 语句 (0)
- AQ (2)
- jms (0)
- 网络资源 (6)
- github (6)
- Easymock (1)
- Dom 解析XML (1)
- windows命令 (2)
- java (7)
- 正则表达式 (5)
- sequence (1)
- oracle 表meta信息 (1)
- 小工具技巧 (1)
- 辅助工具 (1)
- Junit (1)
- 泛型 generic (2)
- Java程序设计 (1)
- cglib (2)
- 架构师之路 (1)
- 数据库连接池 (5)
- c3p0 (1)
- eclipse使用 (1)
- oracle sql plus (1)
- 码农人生 (3)
- SVN (15)
- sqlplus (2)
- jsoup (1)
- 网络爬虫 (2)
- 新技能 (1)
- zookeeper (4)
- hadoop (1)
- SVNKIT (1)
- 从工具到知识点的整理 (1)
- log4j (13)
- 读文件 (0)
- 转义字符 (1)
- command (1)
- web service (3)
- 锁 (1)
- shell 脚本 (1)
- 遇到的错误 (2)
- tomcat (14)
- 房产 (5)
- bootstrap jquery ui (1)
- easyui (2)
- 个人征信 (1)
- 读写分离 (1)
- 备份 (1)
- rmi (6)
- webservice (1)
- JMX (4)
- 内存管理 (3)
- java设计 (1)
- timer (1)
- lock (2)
- concurrent (2)
- collection (1)
- tns (1)
- java基础 (15)
- File (1)
- 本机资源 (1)
- bat (1)
- windows (4)
- 数据结构 (3)
- 代码安全 (1)
- 作用域 (1)
- 图 (2)
- jvm内存结构 (1)
- 计算机思想 (1)
- quartz (6)
- Mongo DB (2)
- Nosql (4)
- sql (5)
- 第三方Java 工具 jar 项目 (2)
- drools (1)
- java swing (2)
- 调用console (1)
- runtime (1)
- process (1)
- swing (2)
- grouplayout (1)
- dubbo (0)
- bootstrap (0)
- nodejs (2)
- SVN hooks (1)
- jdbc (3)
- jdbc error (1)
- precedure (1)
- partition_key (1)
- active mq (1)
- blob (2)
- Eclipse (6)
- web server (1)
- bootstrapt (2)
- struts (1)
- ajax (1)
- js call back (1)
- 思想境界拓展 (1)
- JIRA (1)
- log (1)
- jaxb (3)
- xml java互相转换 (1)
- 装修 (2)
- 互联网 (2)
- threadlocal (3)
- mybatis (22)
- xstream (1)
- 排序 (1)
- 股票资源 (1)
- RPC (2)
- NIO (3)
- http client (6)
- 他人博客 (1)
- 代理服务器 (1)
- 网络 (2)
- web (1)
- 股票 (5)
- deadlock (1)
- JConsole (2)
- activemq (3)
- oralce (1)
- 游标 (1)
- 12月13日道富内部培训 (0)
- grant (1)
- 速查 (2)
- classloader (4)
- netty (4)
- 设计模式 (2)
- 缓存 (2)
- ehcache (2)
- framework (1)
- 内存分析 (2)
- dump (1)
- memory (2)
- 多高线程,并发 (1)
- hbase (2)
- 分布式系统 (1)
- socket (3)
- socket (1)
- 面试问题 (1)
- jetty (2)
- http (2)
- 源码 (1)
- 日志 (2)
- jni (1)
- 编码约定 (1)
- memorycache (1)
- redis (13)
- 杂谈 (1)
- drool (1)
- blockingqueue (1)
- ScheduledExecutorService (1)
- 网页爬虫 (1)
- httpclient (4)
- httpparser (1)
- map (1)
- 单例 (1)
- synchronized (2)
- thread (1)
- job (1)
- hashcode (1)
- copyonwriteArrayList (2)
- 录制声音 (1)
- java 标准 (2)
- SSL/TLS (1)
- itext (1)
- pdf (1)
- 钻石 (2)
- sonar (1)
- unicode (1)
- 编码 (4)
- html (1)
- SecurityManager (1)
- 坑 (1)
- Restful (2)
- svn hook (1)
- concurrentHashMap (1)
- 垃圾回收 (1)
- vbs (8)
- visual svn (2)
- power shell (1)
- wmi (3)
- mof (2)
- c# (1)
- concurrency (1)
- 劳动法 (1)
- 三国志游戏 (2)
- 三国 (1)
- 洪榕 (2)
- 金融投资知识 (1)
- motan (1)
- tkmybatis mapper (1)
- 工商注册信息查询 (1)
- consul (1)
- 支付业务知识 (2)
- 数据库备份 (1)
- 字段设计 (1)
- 字段 (1)
- dba (1)
- 插件 (2)
- PropEdit插件 (1)
- web工程 (1)
- 银行业知识 (2)
- 国内托管银行 (1)
- 数据库 (1)
- 事务 (2)
- git (18)
- component-scan (1)
- 私人 (0)
- db2 (14)
- alias (1)
- 住房 (1)
- 户口 (1)
- fastjson (1)
- test (6)
- RSA (2)
- 密钥 (1)
- putty (1)
- sftp (1)
- 加密 (1)
- 公钥私钥 (3)
- markdown (1)
- sweet (1)
- sourcetree (1)
- 好工具 (1)
- cmd (1)
- scp (1)
- notepad++ (1)
- ssh免密登录 (1)
- https (1)
- ssl (2)
- js (2)
- h2 (1)
- 内存 (2)
- 浏览器 (1)
- js特效 (1)
- io (1)
- 乱码 (1)
- 小工具 (1)
- 每周技术任务 (1)
- mongodb (7)
- 内存泄漏 (1)
- 码云 (2)
- 如何搭建java 视频服务器 tomcat (1)
- 资源 (1)
- 书 (1)
- 四色建模法 (1)
- 建模 (1)
- 配置 (1)
- 职位 (1)
- nginx (1)
- excel (1)
- log4j2 (2)
- 做菜 (1)
- jmap (1)
- jspwiki (1)
- activiti (1)
- 工作流引擎 (1)
- 安卓 (1)
- acitviti 例子 (1)
- 二维码 (1)
- 工作流 (1)
- powerdesign (2)
- 软件设计 (1)
- 乐观锁 (1)
- 王者荣耀 (1)
- session (2)
- token (5)
- cookie (4)
- springboot (24)
- jwt (2)
- 项目路径 (1)
- magicbook (1)
- requestType (1)
- json (2)
- swagger (1)
- eolinker (1)
- springdata (1)
- springmvc (1)
- controlleradvice (1)
- profile (1)
- 银行四要素 (1)
- 支付人员资源 (1)
- 支付渠道 (1)
- yaml (1)
- 中文编码 (1)
- mongo (2)
- serializable (1)
- 序列化 (1)
- zyd (1)
- unittest (1)
- 工具 (1)
- Something (1)
- 通达信 (1)
- protobuf (1)
- 算法 (1)
- springcloud (2)
- hikari (1)
- rocketmq (7)
- cachecloud (1)
- serfj (1)
- axure (1)
- lombok (1)
- 分布式锁 (1)
- 线程 (2)
- 同步代码块 (1)
- cobar (1)
- mq (1)
- rabbitmq (1)
- 定时执行 (1)
- 支付系统 (3)
- 唱歌 (1)
- elasticjob (1)
- 定时任务 (1)
- 界面 (1)
- flink (2)
- 大数据 (1)
- 接私活 (0)
- 内部培训 (2)
最新评论
-
dannyhz:
做股票从短线 试水,然后 慢慢发现 波段和 中期的故事可挖, ...
搭台唱戏 -
dannyhz:
http://developer.51cto.com/art/ ...
如何自己开发框架 它的注意点是什么
引用
Java中使用log4j记录日志
2015-02-01 wei 2 comments
在项目开发中,记录错误日志是一个很有必要功能。一是方便调试;二是便于发现系统运行过程中的错误;三是存储业务数据,便于后期分析;
在java中,记录日志,有很多种方式。
比如,自己实现。
自己写类,将日志数据,以io操作方式,写数据到文本文件。或者是写到数据库中。
比如,使用log4j。
log4j,这也是此文要记录的。log4j,以前在用.Net做web form时,用log4net。平台通吃。而且,log4j可以将日志,输出到console窗口,输出到文本文件,输出到数据库等,功能还是很强大的!
比如,使用jdk自带的logging.jar中的方法。
比如,使用slfj。
slfj,是也是一个很强大的功能。slfj旨在一统天下,也就是slfj提供了logging.jar 和 log4j的接口,可以通过slfj来调用log4j,也可以调用jdk的logging。
从需求出发,记录log4j
1、log4j引入哪些包?
去官网看看吧
2、添加配置文件
在src下,也就是class下,把log4j的配置文件添加进去log4j.properties,标准的properties文件(Properties文件的操作,参考此文)
3、建一个类文件,建主函数,下图为结构
QQ截图20150210163842
4、修改配置文件,使用log4j将日志输出到console窗口
我们经常使用System.out.println(“日志内容”),来将内容输出。今天不用这个了。用log4j的。
log4J配置文件为:
### 设置级别和目的地(这里多个目的地) ###
log4j.rootLogger = DEBUG,CONSOLE
### 这里的me是包,也就是在这个包记录日志时,是只记录debug及以上级别的日志
log4j.logger.me=DEBUG
### 输出到控制台 ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
main主函数调用:
import org.apache.log4j.Logger;
public class Log4jTest {
public static Logger logger1 = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
//logger1
logger1.trace("我是logger1,trace");
logger1.debug("我是logger1,debug");
logger1.info("我是logger1,info");
logger1.warn("我是logger1,warn");
logger1.error("我是logger1,error");
logger1.fatal("我是logger1,fatal");
}
}
可以看到console中输出内容:
16:51:16,575 DEBUG Log4jTest:15 [main:0]- 我是logger1,debug
16:51:16,578 INFO Log4jTest:16 [main:3]- 我是logger1,info
16:51:16,578 WARN Log4jTest:17 [main:3]- 我是logger1,warn
16:51:16,578 ERROR Log4jTest:18 [main:3]- 我是logger1,error
16:51:16,578 FATAL Log4jTest:19 [main:3]- 我是logger1,fatal
5、log4j将日志输出到console窗口,说说输出的格式
在标题4中,看到console的输出内容,是按一定格式输出。格式的配置还是来自于配置文件log4j.properties
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
日志输出格式,所用到的参数如下,按需添加:
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
6、log4j将日志输出到文本文件
log4j配置文件:
### 设置级别和目的地(这里多个目的地) ###
log4j.rootLogger = trace,CONSOLE,zhangsanLog
log4j.logger.me=DEBUG
### 输出到控制台 ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L [%t:%r]- %m%n
### 输出到日志文件 ###
log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 只输出DEBUG级别以上的日志
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天产生一个新的文件
log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false
main函数调用:
public static Logger logger1 = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
//logger1
logger1.trace("我是logger1,trace");
logger1.debug("我是logger1,debug");
logger1.info("我是logger1,info");
logger1.warn("我是logger1,warn");
logger1.error("我是logger1,error");
logger1.fatal("我是logger1,fatal");
}
暂时不做说明,具体配置说明,见后续文章
7、log4j将日志输出到文本文件,并且,每一小时生成一个文件,每天一个文件,每半天一个文件
继续使用标题6的配置,但是需要修改几个地方。
在6中,有这句话
log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender
这句话的意思是,写到文件中,并且追加,那么多久生成一个文件呢?
需要修改
log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd
DatePattern=’.’yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每周
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天两次
5)’.’yyyy-MM-dd-HH: 每小时
6)’.’yyyy-MM-dd-HH-mm: 每分钟
8、log4j将日志输出到文本文件,并且,每当文本文件为3KB大时,新建一个文件。
同样使用6的代码:
log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天产生一个新的文件
log4j.appender.zhangsanLog.MaxFileSize = 2KB
log4j.appender.zhangsanLog.MaxBackupIndex = 5
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false
这里修改的是
log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender
MaxFileSize,当文件达到多大存储空间时,就新建一个文件
MaxBackupIndex,最多会新建几个文件(如果设置的小了,当文件个数较多时,后续就不再新建文件了)
9、log4j将日志输出到数据库
暂无
10、log4j将日志输出到hadoop框架中的hbase上
暂无
Log4j的日志级别
(由低到高。可以联想到windows或unix的错误级别,都是类似的):
trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
debug: 调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。
info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
warn: 有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下depressed的方法)。
error: 错误信息。用的也比较多。
fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。
log4j的配置,说明:
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。一般我常用的是properties文件
1、log4j.rootLogger = [ level ] , appenderName, appenderName, …
level:是log4j的日志级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
appenderName:就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
2、 配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、设置好appender后,针对appender的配置
也就是设置好要输出到什么地方后,其它配置选项
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.’yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每周
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天两次
5)’.’yyyy-MM-dd-HH: 每小时
6)’.’yyyy-MM-dd-HH-mm: 每分钟
(4).RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
4. 配置日志信息的布局,其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
关于additivity
log4j.additivity.zhangsanLog = false
这个additivity也是很有意思的选项。
它是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
效果如下:
log4j.rootLogger=WARN,A2,A3
log4j.logger.test=DEBUG
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=../logs/test.log
log4j.appender.A2.Encoding=UTF-8
log4j.appender.A2.Append=true
log4j.appender.A2.MaxFileSize=2MB
log4j.appender.A2.MaxBackupIndex=5
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n
log4j.additivity.test.xml=false
log4j.logger.test.xml=DEBUG,A3
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.File=../logs/test-xml.log
log4j.appender.A3.Encoding=UTF-8
log4j.appender.A3.Append=true
log4j.appender.A3.MaxFileSize=2MB
log4j.appender.A3.MaxBackupIndex=5
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n
配置文件中有
log4j.logger.test=DEBUG
log4j.additivity.test.xml=false
log4j.logger.test.xml=DEBUG,A3
这个实例中,通过log4j.additivity.test.xml=false这一句取消了继承关系,这样XML的log就只会在A3中输出;而不会在再
还有一个需求,
不考虑日志级别,a.java, b.java, c.java 分别调用自己的logger,将日志分别写入到不同的文件中。
这个需求主要是在配置文件中,给appender取个名字
然后在调用时,使用名称的方式调用,就可以了。
public static Logger loggerA = Logger.getLogger(“Alog”);
public static Logger loggerB = Logger.getLogger(“Blog”);
public static Logger loggerC = Logger.getLogger(“Clog”);
2015-02-01 wei 2 comments
在项目开发中,记录错误日志是一个很有必要功能。一是方便调试;二是便于发现系统运行过程中的错误;三是存储业务数据,便于后期分析;
在java中,记录日志,有很多种方式。
比如,自己实现。
自己写类,将日志数据,以io操作方式,写数据到文本文件。或者是写到数据库中。
比如,使用log4j。
log4j,这也是此文要记录的。log4j,以前在用.Net做web form时,用log4net。平台通吃。而且,log4j可以将日志,输出到console窗口,输出到文本文件,输出到数据库等,功能还是很强大的!
比如,使用jdk自带的logging.jar中的方法。
比如,使用slfj。
slfj,是也是一个很强大的功能。slfj旨在一统天下,也就是slfj提供了logging.jar 和 log4j的接口,可以通过slfj来调用log4j,也可以调用jdk的logging。
从需求出发,记录log4j
1、log4j引入哪些包?
去官网看看吧
2、添加配置文件
在src下,也就是class下,把log4j的配置文件添加进去log4j.properties,标准的properties文件(Properties文件的操作,参考此文)
3、建一个类文件,建主函数,下图为结构
QQ截图20150210163842
4、修改配置文件,使用log4j将日志输出到console窗口
我们经常使用System.out.println(“日志内容”),来将内容输出。今天不用这个了。用log4j的。
log4J配置文件为:
### 设置级别和目的地(这里多个目的地) ###
log4j.rootLogger = DEBUG,CONSOLE
### 这里的me是包,也就是在这个包记录日志时,是只记录debug及以上级别的日志
log4j.logger.me=DEBUG
### 输出到控制台 ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
main主函数调用:
import org.apache.log4j.Logger;
public class Log4jTest {
public static Logger logger1 = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
//logger1
logger1.trace("我是logger1,trace");
logger1.debug("我是logger1,debug");
logger1.info("我是logger1,info");
logger1.warn("我是logger1,warn");
logger1.error("我是logger1,error");
logger1.fatal("我是logger1,fatal");
}
}
可以看到console中输出内容:
16:51:16,575 DEBUG Log4jTest:15 [main:0]- 我是logger1,debug
16:51:16,578 INFO Log4jTest:16 [main:3]- 我是logger1,info
16:51:16,578 WARN Log4jTest:17 [main:3]- 我是logger1,warn
16:51:16,578 ERROR Log4jTest:18 [main:3]- 我是logger1,error
16:51:16,578 FATAL Log4jTest:19 [main:3]- 我是logger1,fatal
5、log4j将日志输出到console窗口,说说输出的格式
在标题4中,看到console的输出内容,是按一定格式输出。格式的配置还是来自于配置文件log4j.properties
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
日志输出格式,所用到的参数如下,按需添加:
%p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
%d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%r: 输出自应用启动到输出该log信息耗费的毫秒数
%c: 输出日志信息所属的类目,通常就是所在类的全名
%t: 输出产生该日志事件的线程名
%l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%: 输出一个”%”字符
%F: 输出日志消息产生时所在的文件名称
%L: 输出代码中的行号
%m: 输出代码中指定的消息,产生的日志具体信息
%n: 输出一个回车换行符,Windows平台为”\r\n”,Unix平台为”\n”输出日志信息换行
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
6、log4j将日志输出到文本文件
log4j配置文件:
### 设置级别和目的地(这里多个目的地) ###
log4j.rootLogger = trace,CONSOLE,zhangsanLog
log4j.logger.me=DEBUG
### 输出到控制台 ###
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L [%t:%r]- %m%n
### 输出到日志文件 ###
log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 只输出DEBUG级别以上的日志
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天产生一个新的文件
log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false
main函数调用:
public static Logger logger1 = Logger.getLogger(Log4jTest.class);
public static void main(String[] args) {
//logger1
logger1.trace("我是logger1,trace");
logger1.debug("我是logger1,debug");
logger1.info("我是logger1,info");
logger1.warn("我是logger1,warn");
logger1.error("我是logger1,error");
logger1.fatal("我是logger1,fatal");
}
暂时不做说明,具体配置说明,见后续文章
7、log4j将日志输出到文本文件,并且,每一小时生成一个文件,每天一个文件,每半天一个文件
继续使用标题6的配置,但是需要修改几个地方。
在6中,有这句话
log4j.appender.zhangsanLog = org.apache.log4j.DailyRollingFileAppender
这句话的意思是,写到文件中,并且追加,那么多久生成一个文件呢?
需要修改
log4j.appender.zhangsanLog.DatePattern = '.'yyyy-MM-dd
DatePattern=’.’yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每周
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天两次
5)’.’yyyy-MM-dd-HH: 每小时
6)’.’yyyy-MM-dd-HH-mm: 每分钟
8、log4j将日志输出到文本文件,并且,每当文本文件为3KB大时,新建一个文件。
同样使用6的代码:
log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender
log4j.appender.zhangsanLog.File =G\:\\var\\alldata\\zhenduan\\debug.log
#log4j.appender.zhangsanLog.File =/var/alldata/zhenduan/debug.log
log4j.appender.zhangsanLog.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.zhangsanLog.Threshold = DEBUG
#'.'yyyy-MM-dd: 每天产生一个新的文件
log4j.appender.zhangsanLog.MaxFileSize = 2KB
log4j.appender.zhangsanLog.MaxBackupIndex = 5
log4j.appender.zhangsanLog.layout = org.apache.log4j.PatternLayout
log4j.appender.zhangsanLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] [%c{1}:%L] [%M] %m%n
log4j.additivity.zhangsanLog = false
这里修改的是
log4j.appender.zhangsanLog = org.apache.log4j.RollingFileAppender
MaxFileSize,当文件达到多大存储空间时,就新建一个文件
MaxBackupIndex,最多会新建几个文件(如果设置的小了,当文件个数较多时,后续就不再新建文件了)
9、log4j将日志输出到数据库
暂无
10、log4j将日志输出到hadoop框架中的hbase上
暂无
Log4j的日志级别
(由低到高。可以联想到windows或unix的错误级别,都是类似的):
trace: 是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出。
debug: 调试么,我一般就只用这个作为最低级别,trace压根不用。是在没办法就用eclipse或者idea的debug功能就好了么。
info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
warn: 有些信息不是错误信息,但是也要给程序员的一些提示,类似于eclipse中代码的验证不是有error 和warn(不算错误但是也请注意,比如以下depressed的方法)。
error: 错误信息。用的也比较多。
fatal: 级别比较高了。重大错误,这种级别你可以直接停止程序了,是不应该出现的错误么!不用那么紧张,其实就是一个程度的问题。
log4j的配置,说明:
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。一般我常用的是properties文件
1、log4j.rootLogger = [ level ] , appenderName, appenderName, …
level:是log4j的日志级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。
appenderName:就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。
2、 配置日志信息输出目的地Appender,其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
3、设置好appender后,针对appender的配置
也就是设置好要输出到什么地方后,其它配置选项
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
DatePattern=’.’yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
1)’.’yyyy-MM: 每月
2)’.’yyyy-ww: 每周
3)’.’yyyy-MM-dd: 每天
4)’.’yyyy-MM-dd-a: 每天两次
5)’.’yyyy-MM-dd-HH: 每小时
6)’.’yyyy-MM-dd-HH-mm: 每分钟
(4).RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.txt:指定消息输出到mylog.txt文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
4. 配置日志信息的布局,其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的layout有以下几种:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
关于additivity
log4j.additivity.zhangsanLog = false
这个additivity也是很有意思的选项。
它是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
效果如下:
log4j.rootLogger=WARN,A2,A3
log4j.logger.test=DEBUG
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=../logs/test.log
log4j.appender.A2.Encoding=UTF-8
log4j.appender.A2.Append=true
log4j.appender.A2.MaxFileSize=2MB
log4j.appender.A2.MaxBackupIndex=5
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n
log4j.additivity.test.xml=false
log4j.logger.test.xml=DEBUG,A3
log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.File=../logs/test-xml.log
log4j.appender.A3.Encoding=UTF-8
log4j.appender.A3.Append=true
log4j.appender.A3.MaxFileSize=2MB
log4j.appender.A3.MaxBackupIndex=5
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%-5p %d [%t] %c{3}.%M - %m%n
配置文件中有
log4j.logger.test=DEBUG
log4j.additivity.test.xml=false
log4j.logger.test.xml=DEBUG,A3
这个实例中,通过log4j.additivity.test.xml=false这一句取消了继承关系,这样XML的log就只会在A3中输出;而不会在再
还有一个需求,
不考虑日志级别,a.java, b.java, c.java 分别调用自己的logger,将日志分别写入到不同的文件中。
这个需求主要是在配置文件中,给appender取个名字
然后在调用时,使用名称的方式调用,就可以了。
public static Logger loggerA = Logger.getLogger(“Alog”);
public static Logger loggerB = Logger.getLogger(“Blog”);
public static Logger loggerC = Logger.getLogger(“Clog”);
发表评论
-
log4j 配置 把某个类的log 屏蔽
2018-10-16 20:37 1472log4j.logger.tfpay.epccReconcil ... -
log4j 里面屏蔽一些类的打印的方式 如 spring
2018-01-24 11:47 761引用 log4j.rootLogger = DEBUG, ... -
log4j的配置详解
2018-01-23 16:22 309http://blog.csdn.net/liangbinny ... -
log4j的 深入包结构分析 码农网一个好网站
2017-03-23 16:51 398http://www.codeceo.com/article/ ... -
日志性能
2017-02-28 18:40 325http://www.infoq.com/cn/article ... -
使用log4j的socket功能
2017-02-17 11:23 304java -classpath log4j.jar org.a ... -
使用log4j的socket功能
2017-02-17 11:19 570java -classpath log4j.jar org.a ... -
log4j 总结和提高
2017-02-16 20:07 472本章主要讲解Java里面比 ... -
这篇对log4j讲的比较细致
2017-02-16 19:58 314http://webcache.googleuserconte ... -
Log4j 的原理和配置
2017-02-16 17:50 404http://www.blogjava.net/wqhtomc ... -
tomcat 里面 对日志的设定 , 也能了解到日志的情况
2016-08-10 16:02 391tomcat 对log4j的设置 http://xsta ... -
Log4j 输出多个文件
2016-04-12 20:27 515http://wangjc-opal.iteye.com/bl ...
相关推荐
4、项目实战篇: Extjs3.2+ASP.NET七层架构+设计模式+ log4j+WebSerice等技术国讯教育通用智能OA办公平台 适用对象 1、要求有一定的javascript语言和HTML,CSS基础的学员 2、有一定的Asp.net网页编程基础和C#语言...
《Handbook of Web Log Analysis》是一本由Bernard J. Jansen、Amanda Spink与Isak Taksa三位学者共同编撰的专业书籍。该书由Information Science Reference出版社出版,并在2009年正式发行。作为一本专注于网站日志...
`log4j`是Apache的一个开源项目,用于提供灵活的日志记录能力,对于调试、维护等非常有帮助。如果项目中没有预先引入`log4j`,可以通过以下方式添加依赖: ```xml <!-- 在pom.xml文件中添加log4j依赖 --> ...
此外,开源组件的历史漏洞关联问题也较为严重,例如Jsoup、Log4j和Commons Collections等知名开源项目都曾爆出严重的安全漏洞。 在开源软件安全实践方面,奇安信代码安全实验室展开了一系列的检测和治理工作。例如...
Log4j是Apache的一个开源日志管理项目,存在与CVE-2017-5645等相关的漏洞;Commons Collections是对JDK数据结构进行补充和扩展的Java集合库,存在与CVE-2015-6420等相关的漏洞;MySQL Connector/J是MySQL官方的JDBC...
- **交换元素**: 在每次外部循环结束时,将当前位置`j`与找到的最小元素位置`smallest`进行交换,确保`j`位置的元素是最小的。 #### 性能分析 选择排序的时间复杂度为\(O(n^2)\),其中`n`为数组的长度。这是因为每...
- 随后,开发者会接触到诸如dom4j、jdom、log4j、Hibernate、Spring、iBatis、Struts等开源框架。 - 数据交换中,JSON和XML的封装和解析是必备技能,正则表达式也在开发中扮演重要角色。 - 开发环境如Tomcat、...
- **log4j日志工具的使用**:教授如何集成log4j并记录日志。 - **MyBatis简单示例**:通过具体案例展示MyBatis的基本使用流程。 - **全局配置文件详解**:深入理解`mybatis-config.xml`文件中的各项配置。 - **映射...
console.log(j);},1000); })(i); } console.log(i); ``` 在这里,我们通过创建一个立即执行的匿名函数并传入当前循环的索引`i`作为参数`j`,从而确保每个回调函数都有自己的`j`副本,这样就不会受到循环结束...
\[ H_2 = -\sum_{i=0}^{255} \sum_{j=0}^{255} P(i, j) \log_2 P(i, j) \] 差分熵则是在一阶熵的基础上考虑了像素之间的差异。它通常用于衡量图像的边缘信息,因为边缘往往对应着像素灰度值的快速变化。差分熵的...
《算法合集之减少冗余与算法优化》的PPT学习教案主要探讨了如何通过减少冗余和优化算法来提高程序执行效率。首先,算法的目标是用最少的时间解决问题,达到最高的效率,而冗余操作是影响效率的重要因素,特别是在...
第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...
因此,Octave可以被视为一种强大的可编程可视化计算工具,简化了许多数值问题的解决过程,让用户有更多时间进行实验和思考问题。 Octave最初是为了辅助本科化学课程而开发的。目前,该项目由J.W.Eaton博士领导,并...
5. 对于二维图像熵,需要考虑像素的邻域灰度分布,公式为:\( H_2 = -\sum_{i,j} p_{i,j} \log_2 p_{i,j} \),其中 \( p_{i,j} \) 是灰度级i和j的联合概率。 实验报告要求详细记录实验过程,包括实验总结和心得,...
\[ H_2 = -\sum_{i=1}^{256}\sum_{j=1}^{256} f(i,j) \log_2 f(i,j) \] 这里,\( f(i,j) \) 是灰度值为i和邻域平均灰度值为j的像素对出现的频率。 在实验中,我们需要先将彩色图像转换为灰度图像,然后计算每个...
在JSP项目中,常用的日志框架有Log4j、Logback等。该项目可能采用了以下方法: 1. 日志级别:定义不同级别的日志,如DEBUG、INFO、WARN、ERROR和FATAL,根据需要记录不同严重程度的信息。 2. 日志拦截:在关键业务...
第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...
第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...
第19章 使用log4j进行日志操作 564 19.1 log4j介绍 564 19.1.1 logger组件 564 19.1.2 appender组件 566 19.1.3 layout组件 567 19.2 使用log4j 568 19.3 log4j使用实例 572 19.4 ndc和mdc 585 19.5 小结 ...