解决方法如下:
如果是log4j.properties为配置文件,比如:
[c-sharp] view plaincopy
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.File=all.log
加入一行:
[c-sharp] view plaincopy
log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.Encoding=UTF-8
log4j.appender.A1.File=all.log
如果是log4j.xml为配置文件,比如:
[c-sharp] view plaincopy
<appender name="A1" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="all.log" />
......
</appender>
加入一行:
[c-sharp] view plaincopy
<appender name="A1" class="org.apache.log4j.RollingFileAppender">
<param name="Encoding" value="UTF-8" />
<param name="File" value="all.log" />
......
</appender>
原理:
log4j通过QuietWriter写日志,QuietWriter extends FilterWriter,FilterWriter extends Writer,而Writer写入的是字符流,对字符集比较敏感。英文系统一般默认latin-1字符集,只能处理半角,通过encoding指定字符集后,能够正确输出指定字符集的字符流。
字符集指定后,WriterAppender的setEncoding通过org.apache.log4j.config.PropertySetter.setProperties(Object obj, Properties properties, String prefix)设置字符集。
加载log4j.properties配置文件需要在web.xml中配置一些信息,配置如下:
File文件的路径配置方法:
1.使用绝对路径,把日志文件放到一个固定的位置,例如D:/logs/log.log。
2.使用环境变量:
A: {user.home}/logs/log.log是把日志文件放到个人用户目录下,系统不同位置可能会有差异,以我的电脑系统(win10)和个人配置为例,${user.home}/logs/log.log代表C:\Users\kzhzhang\logs\log.log。
B: {catalina.home}/logs/error.log是把日志文件放到tomcat第一层目录下。
C: {webApp.root}/logs/error.log是把日志文件放到发布到tomcat下的项目内部,使用这个变量需要在web.xml中配置一些信息,配置如下,
3.设置一个监听器实现ServletContextListener,在项目启动的时候初始化日志保存目录:
在log4j.properties文件中使用log4jdir(变量名称可以随便命名,注意保持一致)变量配置日志文件位置,例如${log4jdir}/log.log,另外还需要在web.xml中配置监听器,配置如下:
ConversionPattern参数的格式含义
可能是程序中取的的是系统的默认编码,自己手动调用时,系统上下文的编码与 LZ 想要的编码一致,但是用 crontab 启动时,crontab 的系统上下文默认编码是 ISO-8859-1 之类的单字节字符编码,程序使用这个编码输出的中文就会变成问号。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)