Log4j日志集中管理
原创
©著作权归作者所有:来自51CTO博客作者此时奋飛的原创作品,请联系作者获取转载授权,否则将追究法律责任
最近遇到这样一个问题,公司线上有中、日、美三种语言的项目,隶属于不同的三台服务器,且每个项目都通过双节点配置,现想实现日志的统一管理,即将所有日志输入到同一台服务器上,然后进行统一记录、管理、分析。最终,通过log4j的SocketAppender进行了实现:
一、客户端的配置:
客户端的配置比较简单,只需要告诉log4j需要监听哪个远程服务器的哪个端口即可。直接在log4j.properties里直接配置就好。
#linux 环境下的日志保存路径
LOG_PATH = /data/ligang/
#windows 环境下的日志保存路径
#LOG_PATH = e:/ligang/
#上线时需确保LOG_PATH为Linux环境下的路径
#输出打印格式
sqlLogFormat = %d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) : %n%m%n
#SQL-LOG的文件大小
sqlMaxFileSize = 5MB
#SQL-LOG文件翻滚数量
sqlMaxBackupIndex=100
#--------------------------------------------------------------
#Log4j Client Configure , Log4j 客户端配置
#SQLLog服务器阀值级别
sqlServerThreshold = INFO
#Remote Server IP 远程Log服务器IP
serverIP = 172.17.3.135
#Remote Server Port 远程Log 服务器端口
serverPort = 12444
#The LocationInfo option takes a boolean value.
#If true, the information sent to the remote host will include location information.
#开启打印位置信息
locationInfo = true
#The ReconnectionDelay option takes a positive integer representing
#the number of milliseconds to wait between each failed connection attempt to the server.
#Setting this option to zero turns off reconnection capability.
#10seconds
#当链接不上服务器时,10秒后会尝试连接。 当为0时,不会重复连接
reconnectionDelay = 10000
#--------------------------------------------------------------
#root log root主日志,所有日志都会打印到rootCategory。除非其他日志对象设置了 additivity = false
log4j.rootCategory=INFO, console, rootLog
# 给主日志添加一个控制台输出打印的对象
log4j.appender.console=org.apache.log4j.ConsoleAppender
# 控制台中输出打印的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# 控制台输出打印的每一行样式
log4j.appender.console.layout.ConversionPattern= %p - [%t] %C.%M : %m%n
# 给主日志添加一个向文件输出打印的对象
# RollingFileAppender 按文件大小翻滚。 DailyRollingFileAppender 按日期翻滚。 此配置都使用了前者.
log4j.appender.rootLog=org.apache.log4j.RollingFileAppender
# 日志输出路径
log4j.appender.rootLog.File=${LOG_PATH}root-Log/root-log.log
# 格式
log4j.appender.rootLog.layout=org.apache.log4j.PatternLayout
# 每一行打印的样式,此处参数按照C语言中的打印规则。
log4j.appender.rootLog.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) - %m%n%n
# 日志文件大小
log4j.appender.rootLog.MaxFileSize=102400KB
# 翻滚日志保存的个数
log4j.appender.rootLog.MaxBackupIndex=20
# 设置 com.ptengine包下的DEBUG级别及以上可以打印输出
log4j.logger.com.ptengine=INFO
# 设置该包下的 WARN 级别及以上可以打印输出
log4j.logger.com.opensymphony.oscache=WARN
log4j.logger.org.apache.commons=WARN
log4j.logger.org.apache.struts=WARN
log4j.logger.org.springframework=WARN
log4j.logger.org.apache.velocity=WARN
#--------------------------------------------------------------
#allSQL log 此日志保存所有关于 insert、update、delete的SQL语句。
#无论这个表存在与否,只要系统执行了更新SQL都会被打印到此日志。
#--------------------------------------------------------------
#用户表userSQL log
# user --> 配置名称。可通过此名称获得一个Log对象。 要与表名保持一致。
# userSQL 配置项 ,userServer userlog在log4j服务器的配置
log4j.logger.user = INFO,userSQL,userServer
# 不在root日志中输出
log4j.additivity.user = false
# 为userSQL配置一个向日志文件输出的对象
log4j.appender.userSQL=org.apache.log4j.RollingFileAppender
# 日志文件的路径,在添加新表配置的时候需保持此格式user-SQL/user-SQL-log.log
log4j.appender.userSQL.File=${LOG_PATH}table/user-SQL/user-SQL-log.log
# 日志文件内容输出格式
log4j.appender.userSQL.layout=org.apache.log4j.PatternLayout
# 每一行日志的输出样式
log4j.appender.userSQL.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}- %p %t %c (line:%L) : %n%m%n
# 日志文件大小,到达5120kb后,日志会向将内容翻滚到其他文件中
log4j.appender.userSQL.MaxFileSize=5120KB
# 保存翻滚的文件数量
log4j.appender.userSQL.MaxBackupIndex=100
#Log4j的服务器日志配置
log4j.appender.userServer=org.apache.log4j.net.SocketAppender
log4j.appender.userServer.RemoteHost=${serverIP}
log4j.appender.userServer.Port=${serverPort}
log4j.appender.userServer.LocationInfo=${locationInfo}
log4j.appender.userServer.ReconnectionDelay=${reconnectionDelay}
log4j.appender.userServer.Threshold = ${sqlServerThreshold}
#其他需加日志的表同user表一样配置
二、日志服务器的配置:
日志服务器需要单独启动一个java进程,接收客户端给自己发送的socket请求。Log4j提供了org.apache.log4j.net.SocketServer类,直接运行其main函数就行了。需要一直后台运行,所以在这用到了startup、shutdown俩个shell脚本。将log4j-server-12444上传到/opt目录下并解压。
运行/opt/log4j-server-12444/startup.sh 启动服务。
运行/opt/log4j-server-12444/shutdown.sh 停止服务。
catalina.sh 文件:
#!/bin/bash
#当前脚本所在绝对路径
basepath=`dirname $0`"/"
#端口
LISTEN_PORT=12444
#服务端log4j配置文件
SERVER_CONFIG="$basepath"conf/log4jserver.properties
#客户端的配置
CLIENT_CONFIG_DIR="$basepath"conf/lcf/
#Java程序所在的目录(classes的上一级目录)
APP_HOME="$basepath"lib
#需要启动的Java主程序(main方法类)
APP_MAINCLASS=org.apache.log4j.net.SocketServer
#拼凑完整的classpath参数,包括指定lib目录下所有的jar
CLASSPATH=$APP_HOME/log4j-1.2.17.jar
#JDK所在路径
JAVA_HOME=/opt/jdk1.6.0_25
#执行程序启动所使用的系统用户
RUNNING_USER=ligang
#java虚拟机启动参数
JAVA_OPTS="-ms512m -mx512m -Xmn256m -Djava.awt.headless=true -XX:MaxPermSize=128m"
log4j的服务器,也需要一个服务器段的配置文件,这里用的是conf/log4jserver.properties,其中一些配置与客户端的配置文件大同小异(就是web项目中的log4j.properties),主要的是服务器端配置客户端的log。
配置文件在conf/lcf/generic.lcf,里面的配置与web中的一样,只是没有root根日志。
log的配置名称要与web中的一致,否则会导致服务器端的日志无法打印。
在web中新加SQL表log的时候,需要在服务器的generic.lcf中加上。
三、javaweb端:
通过org.apache.commons.logging.Log和org.apache.commons.logging.LogFactory进行控制日志的输入。