篇十二:日志整理
一、使用环境搭建
1、jar包引入--maven
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging </artifactId> <version>1.1.3</version> </dependency>
2、配置拦截器,获取日志的公共部分
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.MDC; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.alibaba.druid.util.StringUtils; public class LogsInterceptor implements HandlerInterceptor { @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse arg1, Object arg2) throws Exception { //获取用户userId String userId = req.getParameter("userId"); //获取请求的IP String ip = req.getRemoteAddr(); //获取请求的路径 String url = req.getServletPath(); //放入MDC if(StringUtils.isEmpty(userId)) userId="test"; //开发阶段,无法从缓存中获取用户信息 MDC.put("userId",userId); MDC.put("ip",ip); return true; } }
配置拦截器:
<mvc:mapping path="/mobile/**"/>:配置拦截器拦截路径
<mvc:exclude-mapping path="/loginpage/**"/> :配置不拦截路径,可以同时配置多个
建议:拦截的路径放在前面,不拦截的路径配置在后面
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/mobile/**" /> <!--<mvc:exclude-mapping path="/loginpage/**"/> --> <!-- 定义在mvc:interceptor下面的表示是对特定的请求才进行拦截的 --> <bean class="com.guduo.mobile.log.LogsInterceptor"/> </mvc:interceptor> </mvc:interceptors>
3、参考日志表
操作日志:
CREATE TABLE `tbl_mobile_operation_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`userId` varchar(64) DEFAULT NULL COMMENT '用户ID',
`userName` varchar(64) DEFAULT NULL COMMENT '用户名',
`operationMoudle` int(2) DEFAULT NULL COMMENT '操作模块 ',
`type` int(1) DEFAULT NULL COMMENT '操作类型 (1:新增,2:更新,3:删除,4:查询,5:上传,6:下载,7:导出)',
`status` int(1) DEFAULT NULL COMMENT '操作状态 (1:成功,2:失败)',
`ip` varchar(100) DEFAULT NULL COMMENT 'IP地址',
`content` varchar(3000) DEFAULT NULL COMMENT '操作内容 ',
`errorMsg` varchar(3000) DEFAULT NULL COMMENT '失败原因 ',
`createTime` datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2451249 DEFAULT CHARSET=utf8 COMMENT='移动端操作日志';
登录日志
CREATE TABLE `tbl_login_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`userId` varchar(40) NOT NULL COMMENT '用户id',
`type` int(2) NOT NULL COMMENT '操作类型(1:APP登陆,2:后台登陆,3:新闻发布系统登陆)',
`status` int(1) NOT NULL DEFAULT '1' COMMENT '操作状态(1:成功,2:失败)',
`ip` varchar(30) NOT NULL COMMENT 'IP地址',
`errorMsg` varchar(100) DEFAULT NULL COMMENT '失败原因',
`createTime` datetime NOT NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1468 DEFAULT CHARSET=utf8 COMMENT='登陆日志表';
二、常用日志类型
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方),
org.apache.log4j.jdbc.JDBCAppender(用于数据库),
org.apache.log4j.net.SMTPAppender(发送日志给邮件),
org.apache.log4j.RollingFileAppender(应用于socket)
三、Layout属性
1.org.apache.log4j.HTMLLayout(以HTML表格形式布局),
2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息
|
转换字符 |
表示的意思 |
|
c |
用于输出的记录事件的类别, 通常就是所在类的全名。例如,对于类别名称"a.b.c" 模式 %c{2} 会输出 "b.c" |
|
C |
用于输出呼叫者发出日志请求的完全限定类名。例如,对于类名 "org.apache.xyz.SomeClass", 模式 %C{1} 会输出 "SomeClass". |
|
d |
用于输出的记录事件的日期。例如, %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}. |
|
F |
用于输出被发出日志记录请求,其中的文件名 |
|
l |
用于将产生的日志事件调用者输出位置信息, 包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) |
|
L |
用于输出从被发出日志记录请求的行号 |
|
m |
用于输出使用日志事件相关联的应用程序提供的消息 |
|
M |
用于输出发出日志请求所在的方法名称 |
|
n |
输出平台相关的行分隔符或文字 |
|
p |
用于输出的记录事件的优先级 |
|
r |
用于输出毫秒从布局的结构经过直到创建日志记录事件的数目 |
|
t |
用于输出生成的日志记录事件的线程的名称 |
|
x |
用于与产生该日志事件的线程相关联输出的NDC(嵌套诊断上下文) |
|
X |
在X转换字符后面是键为的MDC。例如 X{clientIP} 将打印存储在MDC对键clientIP的信息 |
|
% |
文字百分号 %%将打印%标志 |
四、配置说明(配置范围)
1、 完善的配置文件包含:
l 级别:debug、info、warn、error、fatal和log
DEBUG<INFO <WARN<ERROR<FATAL。
l Appender:参考3.1
l Layout:参考3.2
2、 配置范围:
l 全局:log4j.rootLogger=INFO[s1] ,A1[s2] ,DRF
l 指定路径:log4j.logger[s3] .com.ibatis[s4] =INFO,DEBUG
3、 Class类创建日志对象命名:
l log4j:private static Logger log = Logger.getLogger(ClassName.class);
l Apache:private static Log log = LogFactory.getLog(ClassName.class);
建议使用Apache,maven导入jar包commons-logging
注释说明:
[s1]日志级别
[s2]独立的配置文件的名称,一个配置文件可包含多个独立的子配置文件
[s3]区别“rootLogger”,表明是指定路径,以“.”结束
[s4]包路径,参考Class类属性Package
五、输出控制台
log4j.logger.com.guduo.mobile.controller.pay=INFO,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold[s1] =DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=UTF-8
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[service] %-5p %d{yyyy-MM-dd HH:mm:ss} - %c -%-4r [%t] - %m%n
[s1]最低输出级别
六、输出数据库
log4j.logger.com.guduo.mobile.controller.pay=INFO,DATABASE
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://192.168.1.91:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root[s1]
log4j.appender.DATABASE.password=abcd%1234
log4j.appender.DATABASE.sql= INSERT INTO tbl_mobile_operation_log [s2] (operatorId,operationMoudle,type,status,ip,content,errorMsg,createTime) VALUES ('%X{userId}',%X{operationMoudle},%X{type},%X{status},'%X{ip}','%m','%X{errorMsg}'[s3] ,'%d{yyyy-MM-dd HH:mm:ss}')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
[s1]数据库连接属性,每列不要有空格
[s2]需要有空格
[s3]%X{MDC中定义的属性名},是否有引号,取决于数据库列属性,int型不需要,varchar型需要
注意:单行输完,结尾不能有空格,sql除外
七、输出日志文件
log4j.logger.com.guduo.mobile.controller.pay=INFO,FILE
log4j.appender.FILE=org.apache.log4j.FileAppender Log4j
log4j.appender.FILE.File= D:/logs/guduo-service-user.log
log4j.appender.FILE.Append[s1] =true
log4j.appender.FILE.Encoding=UTF-8
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[service] %-5p %d{yyyy-MM-dd HH:mm:ss} - %c -%-4r [%t] - %m%n
[s1]默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容
八、输出日志文件(每天新建)
log4j.logger.com.guduo.mobile.controller.pay=INFO,A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=D:/logs/guduo-service-user.log
log4j.appender.A1.Encoding=UTF-8
log4j.appender.A1.DatePattern[s1] ='.'yyyy-MM-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[service] %-5p %d{yyyy-MM-dd HH:mm:ss} - %c -%-4r [%t] - %m%n
九、输出日志文件(达到指定大小新建)
log4j.logger.com.guduo.mobile.controller.pay=INFO,File
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold[s2] =INFO
log4j.appender.ROLLING_FILE.File= D:/logs/guduo-service-user.log
log4j.appender.ROLLING_FILE.Append[s3] =true
log4j.appender.CONSOLE_FILE.Encoding=UTF-8
log4j.appender.ROLLING_FILE.MaxFileSize[s4] =10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex[s5] =10
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
强调:
日志文件的输出可以是指定的路径:D:/logs/guduo-service-user.log
也可以是相对tomcat的位置:${catalina.base}/logs/guduo-mobile.log ------:tomcat/logs

浙公网安备 33010602011771号