具体基本知识介绍:见 http://gyfmp5.iteye.com/blog/103253 有非常详细介绍
实际中碰到的问题:
1. 如何让不同的类或包的日志输入不同的目的地(文件、 db 等)
比如:按照业务不同输入不同的日志文件,宽带业务、预付费业务输入不同的日志文件
解决:
log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL
log4j.logger. xxx.yyy.zzz = info , FILE_UORSS
这里把包 com.ht.ibms.orderadmin.service.tache.adsl 下的类的日志写入 FILE_ADSL 文件 级别为 debug ;
2. 如何让不同级别的日志级别输入不同的目的地(文件、 db 等)
让 err 、 info 、 debug 输入不同的日志文件;这样方便使用查找
解决:
log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL
log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = info ,FILE_ADSL_2
也可以配置 这样
log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug ,FILE_ADSL
log4j.logger.com.ht.ibms.orderadmin.service.tache.adsl = debug,FILE_ADSL_2
但 appender FILE_ADSL_2 要设置最低接受级别 log4j.appender.FILE_ADSL_2.Threshold= info
3. 日志配置文件实时加载
不想重启服务器而想重新加载日志的配置文件
解决见下文
4. 日志配置 File 的相对路径配置
日志 File 方式的相对路径怎么配置;相对路径能是软件真正的跨平台跨路径使用
解决见下文
分析:
其实, log4j 在加载的时候会在 class 路径里找 log4j.properties 文件,如果找到了就会赋给 PropertyConfigurator 配置
PropertyConfigurator.configure(props);// 装入 log4j 配置信息
PropertyConfigurator.configure(xxxFilePath);// 装入 log4j 配置信息
在实时加载的时候就要重新配置加载下 ~
log4j 中配置日志文件相对路径
http://www.whitehouse.net.cn/blog/Article/log4j_config.html
法一、 解决的办法自然是用相对路径代替绝对路径,其实 log4j 的 FileAppender 本身就有这样的机制,如: log4j.appender.logfile.File=${WORKDIR}/logs/app.log
其 中 “${WORKDIR}/” 是个变量,会被 System Property 中的 “WORKDIR” 的值代替。这样,我们就可以在 log4j 加载配置文件之前,先用 System.setProperty ("WORKDIR", WORKDIR); 设置好根路径,此操作可通过一初始的 servlet 进行。
法二、可以使用服务器环境变量
log4j 的配置文件支持服务器的 vm 的环境变量,格式类似 ${catalina.home}
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB
其 中的 ${catalina.home} 并非 windows 系统的环境变量,这个环境变量就不需要在 Windows 系统的环境变量中设置。之所以这样,你可 以看看 tomcat\bin\catalina.bat(startup,shutdown 都是调用这个 ) 里面自带有 -Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数 -Dmylog.home="D:/abc/log" 到对应的服务器 java 启动的 vm 参数中
法三、通过 servlet 初始化 init() 方法中加载 file 属性实现相对路径
具 体实现 : 做一个 servlet, 在系统加载的时候 , 就把 properties 的文件读到一个 properties 文件中 . 那个 file 的属性值 ( 我使用的 是相对目录 ) 改掉 ( 前面加上系统的根目录 ), 让后把这个 properties 对象设置到 propertyConfig 中去 , 这样就初始化了 log 的设置 . 在后面的使用中就用不着再配置了
一般在我们开发项目过程中 ,log4j 日志输出路径固定到某个文件夹 , 这样如果我换一个环境 , 日志路径又需要重新修改 , 比较不方便 , 目前我采用了动态改变日志路径方法来实现相对路径保存日志文件
(1). 在项目启动时 , 装入初始化类 :
public class Log4jInit extends HttpServlet { static Logger logger = Logger.getLogger(Log4jInit.class); public Log4jInit() { } public void init(ServletConfig config) throws ServletException { String prefix = config.getServletContext().getRealPath("/"); String file = config.getInitParameter("log4j"); String filePath = prefix + file; Properties props = new Properties(); try { FileInputStream istream = new FileInputStream(filePath); props.load(istream); istream.close(); //toPrint(props.getProperty("log4j.appender.file.File")); String logFile = prefix + props.getProperty("log4j.appender.file.File");// 设置路径 props.setProperty("log4j.appender.file.File",logFile); PropertyConfigurator.configure(props);// 装入 log4j 配置信息 } catch (IOException e) { toPrint("Could not read configuration file [" + filePath + "]."); toPrint("Ignoring configuration file [" + filePath + "]."); return; } } public static void toPrint(String content) { System.out.println(content); } }
实 际上 log4j 的配置文件 log4j.properties 如为默认名,可放置在 JVM 能读到的 classpath 里的任意地方,一般是放在 WEB- INF/classes 目录下。当 log4j 的配置文件不再是默认名,则需要另外加载并给出参数,如上 “ropertyConfigurator.configure(props);// 装入 log4j 配置信息 ”
(2).Web.xml 中的配置
<servlet> <servlet-name>log4j-init</servlet-name> <servlet-class>Log4jInit</servlet-class> <init-param> <param-name>log4j</param-name> <param-value>WEB-INF/classes/log4j.properties</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
注意:上面的 load-on-startup 设为 0 ,以便在 Web 容器启动时即装入该 Servlet 。 log4j.properties 文件放在根的 properties 子目录中,也可以把它放在其它目录中。应该把 .properties 文件集中存放,这样方便管理。
(3).log4j.properties 中即可配置 log4j.appender.file.File 为当前应用的相对路径。
+
_
)
(
*
*