属性文件:
log4j.rootLogger = warn,stdout
log4j.logger.mysql = info,mysql
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.mysql =org.apache.log4j.jdbc.JDBCAppender
log4j.appender.mysql.driver =com.mysql.jdbc.Driver
log4j.appender.mysql.URL=jdbc:mysql://localhost:3306/tl
log4j.appender.mysql.user =root
log4j.appender.mysql.password =alen
#log4j.appender.mysql.bufferSize =1
log4j.appender.mysql.sql=INSERT INTO loginLog(message,ip) VALUES('[framework] %d - %c -%4r [%t] %-5p %c %x - %m%n','%m%n')
log4j.appender.mysql.layout=org.apache.log4j.PatternLayout
log4j.appender.mysql.layout.ConversionPattern=[framework] %d - %c -%4r [%t] %-5p %c %x - %m%n'
XML:
<appender name="database"
class="org.apache. log4j.jdbc. JDBCAppender">
<param name="BufferSize" value="5" />
<param name="Driver" value="com.mysql.jdbc.Driver" />
<param name="URL"
value="jdbc:mysql://192.168.0.14/ispc?useUnicode=true&characterEncoding=UTF-8" />
<param name="User" value="root" />
<param name="Password" value="admin" />
<layout class="org.apache. log4j.PatternLayout">
<param name="ConversionPattern"
value="INSERT INTO log (level,msg,datetime) VALUES ( '%p', '%m','%d{yyyy-MM-dd HH:mm:ss}')" />
</layout>
<filter class="org.apache. log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN" />
<param name="acceptOnMatch" value="false" />
</filter>
</appender>
问题:
假设在登陆接口中,要把登陆失败的人的ID,IP写入数据库(即多个自定义信息), log4j能做吗?
// logger.warn(??);//方法中这里应该怎样写??
logger.warn(ID + "," + IP)//这样??,插进数据库时怎样把ID, IP分别插进2个字段?
自己写的appender再怎么改也只能拿个%m ...
log4j中有个MDC也许可以做到分开插,但写一个LOG麻烦多少倍,倒不如自己插数据表 ?
MDC.put("ID", ID);
MDC.put("IP", IP);
logger.warn("login failed");
一个解决方法:
包装 log4j ,自定义 warn(Object... msgs){
//一些处理,让此方法满足配置文件及我们的要求
MDC.put("ID", ID);
MDC.put("IP", IP);
logger.warn("login failed");
}
log4j.rootLogger = warn,stdout
log4j.logger.mysql = info,mysql
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.mysql =org.apache.log4j.jdbc.JDBCAppender
log4j.appender.mysql.driver =com.mysql.jdbc.Driver
log4j.appender.mysql.URL=jdbc:mysql://localhost:3306/tl
log4j.appender.mysql.user =root
log4j.appender.mysql.password =alen
#log4j.appender.mysql.bufferSize =1
log4j.appender.mysql.sql=INSERT INTO loginLog(message,ip) VALUES('[framework] %d - %c -%4r [%t] %-5p %c %x - %m%n','%m%n')
log4j.appender.mysql.layout=org.apache.log4j.PatternLayout
log4j.appender.mysql.layout.ConversionPattern=[framework] %d - %c -%4r [%t] %-5p %c %x - %m%n'
XML:
<appender name="database"
class="org.apache. log4j.jdbc. JDBCAppender">
<param name="BufferSize" value="5" />
<param name="Driver" value="com.mysql.jdbc.Driver" />
<param name="URL"
value="jdbc:mysql://192.168.0.14/ispc?useUnicode=true&characterEncoding=UTF-8" />
<param name="User" value="root" />
<param name="Password" value="admin" />
<layout class="org.apache. log4j.PatternLayout">
<param name="ConversionPattern"
value="INSERT INTO log (level,msg,datetime) VALUES ( '%p', '%m','%d{yyyy-MM-dd HH:mm:ss}')" />
</layout>
<filter class="org.apache. log4j.varia.LevelRangeFilter">
<param name="levelMin" value="WARN" />
<param name="levelMax" value="WARN" />
<param name="acceptOnMatch" value="false" />
</filter>
</appender>
问题:
假设在登陆接口中,要把登陆失败的人的ID,IP写入数据库(即多个自定义信息), log4j能做吗?
// logger.warn(??);//方法中这里应该怎样写??
logger.warn(ID + "," + IP)//这样??,插进数据库时怎样把ID, IP分别插进2个字段?
自己写的appender再怎么改也只能拿个%m ...
log4j中有个MDC也许可以做到分开插,但写一个LOG麻烦多少倍,倒不如自己插数据表 ?
MDC.put("ID", ID);
MDC.put("IP", IP);
logger.warn("login failed");
一个解决方法:
包装 log4j ,自定义 warn(Object... msgs){
//一些处理,让此方法满足配置文件及我们的要求
MDC.put("ID", ID);
MDC.put("IP", IP);
logger.warn("login failed");
}