log4j与logback自定义文件存放目录方法

       为了方便日志的管理,我们在集群之间通过网络挂载的方式创建了一个共享目录即在所有的服务器上均可以访问此磁盘目录。因此我们在写日志时需要根据集群的环境动态的设定日志的存储路径。

       我们的工程日志的记录采用了两种方式log4j和sl4f+logback

一、log4j自定义路径

       1、创建类LogbackCustomName让其继承ServletContextListener。

   public static final String log4jdirkey = "log4jdir";

 @Override
 public void contextDestroyed(ServletContextEvent log4jdirkey) {

  System.getProperties().remove(log4jdirkey);

 }

 @Override
 public void contextInitialized(ServletContextEvent servletcontextevent) {
  InetAddress netAddress = getInetAddress();

//获取主机名 此方法也可以获取主机IP但是只能在windows中使用

  String log4jdir = getHostName(netAddress);

  System.setProperty(log4jdirkey, log4jdir);
 }

 public static InetAddress getInetAddress() {

  try {
   return InetAddress.getLocalHost();
  } catch (UnknownHostException e) {
   e.printStackTrace();
  }
  return null;

 }

 public static String getHostName(InetAddress netAddress) {
  if (null == netAddress) {
   return null;
  }
  String ip = netAddress.getHostName();
  return ip;
 }
2、修改web.xml文件

       在web.xml中增加监听

 <listener>
  <listener-class>XXX.XXXX.LogbackCustomName</listener-class>
 </listener>

      这一段一定要放在Spring的监听之前,否则不会生效。

 配置完成后在日志写入路径中加上${log4jdir}即可。

 二、logback自定义路径

1、首先创建类LogbackCustomName继承logback中的PropertyDefinerBase

  @Override
 public String getPropertyValue() {
  String info;
  InetAddress netAddress = getInetAddress();

//获取主机名 linux多网卡无法根据环境指定具体网卡,此方法只能在windows下使用
  info = getHostName(netAddress); 
  return info;

 }

 public static InetAddress getInetAddress() {

  try {
   return InetAddress.getLocalHost();
  } catch (UnknownHostException e) {
   e.printStackTrace();
  }
  return null;

 }

 public static String getHostName(InetAddress netAddress) {
  if (null == netAddress) {
   return null;
  }
  String ip = netAddress.getHostName();
  return ip;
 }

二、修改logback.xml配置文件,增加自定义变量

 <define  name="HostName" class="XXX.XXX..LogbackCustomName" /> 

然后在定义路径时在路径名上加上${HostName}即可。

相关推荐