多进程写日志文件

方法一:

解决log4j公用配置文件,多进程同时写同一个log文件,因存在操作系统pv操作问题, 导致部分日志丢失。解决方案是不同的进程写不同的log文件

测试于:Log4j 1.2.15 | CentOS 5.7

假设有个一个web项目,项目中同时包含一些app,这些app是是需要用java命令来启动的。
每启动一个app就相当于启动一个虚拟机,即一个进程。

问题一:如果公用项目中的log4j,那么必然多进程同时同一个log文件,存在操作系统pv操作问题,
导致部分日志丢失。
问题二:如何实现在代码,log4j等配置文件公用的情况下,不同的进程写不同的log文件?

解决方法:

  1. 在app 用java命令启动的时候增加-D参数。
    假设是Linux 下Java启动脚本中的脚本,只需修改JAVA_OPTS值,即

JAVA_OPTS="-Xms64m -Xmx512m -Djava.awt.headless=true -Dlog4j.log.app=app1"

  1. 在log4j的配置文件中调用此变量
    假设是Log4j 实例配置解析中的配置,需要修改log4j.appender.F.file值,即

log4j.appender.F.file = /logs/basic/${log4j.log.app}/log

假设web项目中有两个app,app1和app2
各自的启动脚本中配置为-Dlog4j.log.app=app1和-Dlog4j.log.app=app2
tomcat启动jvm并没有配置,所以log4j会默认为空,log目录效果如下

app日志会放在相应的app*目录下
web日志由于没有得到-D配置,会放在和app*目录平级的位置,当然如果需要的也可以修改tomcat bin下的catalina.sh,增加-D参数,但为了让项目和web服务器解耦,不推荐这么做。

当然有人可能会说,可以用在启动java进程时将日志重定向到指定的文件中,如

nohup java $JAVA_OPTS $MAIN_CLASS $* > /logs/basic/app1/log &

这种方法的缺点是不能实现日志的自动切割,不能避免日志不断增大甚至占满磁盘的问题。

如过此内容对您有帮助,欢迎以点击广告的形式来支持我们,但请每天不要多于一次,否则可能被识别恶意点击,导致封号。

方法二

1.log4j代码片段(log4j的配置文件支持System Property的环境变量的获取)

<appender name="FILE"
class="org.apache.log4j.DailyRollingFileAppender">

<param name="File"
value="D:/${weblogic.Name}ank.log" />

<param name="DatePattern"
value="'.'yyyy-MM-dd-HH" />

<layout
class="org.apache.log4j.PatternLayout">

<param name="ConversionPattern"
value="%-5p %c{1} %m%n" />

</layout>

</appender>

2.${weblogic.Name}对应的是JAVA启动时环境变量;

看startWebLogic.sh中的代码片段

D:\bea92\JDK150~1\bin\java -client  
-Dweblogic.Name=AdminServer

如何设置JAVA启动时的环境变量:

java  -D<参数>=<值>

3.使用spring中的Log4jConfigListener把log文件定在 /WEB-INF/logs/ 而不需要写绝对路径。

log4j.xml配置片段:

Java代码  

  1. <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
  2. lt;param name="File" value="${webapp.root}/WEB-INF/logs/${weblogic.Name}-jrwwg.log" />
  3. <param name="DatePattern" value="'.'yyyy-MM-dd-HH" />
  4. <layout class="org.apache.log4j.PatternLayout">
  5. <param name="ConversionPattern" value="%-5p %c{1} %m%n" />
  6. </layout>
  7. </appender>

web.xml配置片段

Xml代码  

  1. <context-param>
  2. <param-name>log4jConfigLocation</param-name>
  3. <param-value>/WEB-INF/classes/log/log4j.xml</param-value>
  4. </context-param>
  5. <!---定时扫描loj4j配置文件的变化---->

<context-param>

<param-name>log4jRefreshInterval</param-name>

<param-value>6000</param-value>

</context-param>

Xml代码  

  1. <listener>
  2. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  3. </listener>

自己实践

用方法一配置 -Dlog4j.log.app=app1  时,


下图中是可以实现的:

 

但是在
weblogic中的
server start中
配置 不起作用,如下图:

 

用方法二 完美的解决了问题。

log4j 多进程配置要注意的的更多相关文章

  1. commons-logging和Log4j 日志管理/log4j.properties配置详解

    commons-logging和Log4j 日志管理 (zz) 什么要用日志(Log)? 这个……就不必说了吧. 为什么不用System.out.println()? 功能太弱:不易于控制.如果暂时不 ...

  2. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  3. Log4J实用配置指南

    转自:http://www.cnblogs.com/licheng/archive/2008/08/23/1274566.html 1         概述 本文档是针对Log4j日志工具的使用指南. ...

  4. Log4j XML配置

    问题描述:     Log4j  XML配置 问题解决:     (1)编写log4j.xml配置文件 注:     如上的XML文件必须以log4j.xml文件命名,否则无法读取配置文件,同样的如果 ...

  5. Hibernate4搭建Log4J日志管理(附Log4j.properties配置详解)

    1.首先加入slf4j的jar包,即slf4j-api-1.6.1.jar 在hibernate官网下载hibernate-release-4.2.2.Final.zip并解压,在hibernate- ...

  6. java之log4j的配置

    java之log4j的配置 log4j有很多的优点,用起来很方便,就是配置起来有些麻烦,下面我介绍一下log4j的配置方法. log4j是用来记录日志的. 软件的运行过程离不开日志.日志主要用来记录系 ...

  7. Log4j.properties配置详细解读

    Log4j.properties配置 Log4j有三个主要的组件:Loggers(记录器),Appenders  (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以 ...

  8. 热切换Log4j级别配置

    欢迎和大家交流技术相关问题:邮箱: jiangxinnju@163.com博客园地址: http://www.cnblogs.com/jiangxinnjuGitHub地址: https://gith ...

  9. java日志框架log4j详细配置及与slf4j联合使用教程

    最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...

随机推荐

  1. 【原创】大叔经验分享(74)nginx对静态文件加速

    通过location配置 location ~ \.html$ { add_header 'Cache-Control' 'no-cache'; } location ~ \.(js|css|gif| ...

  2. webpack提取公共js代码

    webpack打包js代码与提取公共js代码分析 webpack提取公共js代码示例 一.分析 webpack默认打包js代码时,是将从入口js模块开始,将入口js模块所依赖的js以及模块逐层依赖的模 ...

  3. php扩展库解释

    扩展库 说明 注解 php_bz2.dll bzip2 压缩函数库 无 php_calendar.dll 历法转换函数库 自 PHP 4.0.3 起内置 php_cpdf.dll ClibPDF 函数 ...

  4. python调用其他脚本

    1.用python调用python脚本 #!/usr/local/bin/python3. import time import os count = str = ('python b.py') re ...

  5. beego注解路由的格式

    原文: https://blog.csdn.net/weixin_33743880/article/details/88016192 beego注解路由的注释,我们可以把我们的注释分为以下类别: @T ...

  6. 2.2.EJB_Bean

    1.EJB中的三种Bean 1.会话bean(sessionbean) 负责与客户端交互.是编写业务逻辑的地方.在会话Bean中可以通过jdbc直接操作数据厍.但大多数情况下都是通过实体bean来完 ...

  7. ubuntu下python3.6.5import tensorflow显示非法指令(核心已转储)

    1.版本 ubuntu版本为14.04 python为3.6.5 tensorflow为pip3安装的1.8.0版本 2.解决 删除原先的tensorflow:sudo pip3 uninstall ...

  8. Java程序向MySql数据库中插入的中文数据变成了问号

    找到mysql的安装目录,修改my.ini文件 (1)如何找到my.ini文件 如果my.ini文件不在MySQL的安装目录下,可能放在隐藏目录,要先去找到ProgramData,(这里要先打开显示隐 ...

  9. 二叉树的相关定义及BST的实现

    一.树的一些概念 树,子树,节点,叶子(终端节点),分支节点(分终端节点): 节点的度表示该节点拥有的子树个数,树的度是树内各节点度的最大值: 子节点(孩子),父节点(双亲),兄弟节点,祖先,子孙,堂 ...

  10. Date 对象

    JavaScript Date 对象 Date 对象 Date 对象用于处理日期与时间. 创建 Date 对象: new Date() 以下四种方法同样可以创建 Date 对象: var d = ne ...