2016-03-23 2 views
7

Я хочу добавить имя хоста и дату в имя файла журнала. Файл журнала должен быть как app_hostname.date.log. Примечание: Это должно работать как в linux и windows.Как добавить имя хоста в файл журнала в log4j.xml

<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="${path}/app.log" /> 
     <param name="MaxFileSize" value="1MB" /> 
     <param name="DatePattern" value=".dd-MM-yyyy" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/> 
     </layout> 
</appender> 

И как добавить фильтр, основанный на шаблоне журнала, а не как StringMatchFilter .Я хочу метасимволом. Заранее заблаговременно

+0

рассмотрите использование 'logback' или' log4j2'. начните с 'SiftingAppender журнала ' – Nati

+0

@ Nati. Пожалуйста, будьте более конкретными. Если возможно, с помощью кода snippet –

ответ

3

Сделайте это первым из кода Javaзатемнастроить log4j в приложение,

ПРИМЕЧАНИЕ: ручка или улов требуется. Исключение при выполнении кода ниже.

// step-1 : set hostName into System's property, which will use by log4j 
System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
//step - 2 : set currentDate into System's property, which will use by log4j 
System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date())); 
//step - 3 : now configure/load log4j into Application , if it's not still loaded earlier then. 
org.apache.log4j.Logger LOG = Logger.getLogger(YourJavaClassName.class); // ALERT : before this step above 2-step must needs to be execute, otherwise file-name won't appear as you required. 

//LOG.debug("anything whatever programmer what to log"); 

ОБНОВЛЕНО:

Если приложение веб-приложение, то необходимо настроить свойство, которое мы хотим здесь после tomcat-server начала и до любого application перспективе,

для этого создать один класс ApplicationConfiguration, в котором реализован интерфейс ServletContextListener, который помогает здесь запускать сначала до запуска любого приложения.

сделать то же самое,

import java.net.InetAddress; 
import java.net.UnknownHostException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

public class ApplicationConfiguration implements ServletContextListener{ 

    @Override 
    public void contextDestroyed(ServletContextEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 

     try { 
      // step-1 : set hostName into System's property, which will use by log4j 
      System.setProperty("hostName", InetAddress.getLocalHost().getHostName()); 
      //step - 2 : set currentDate into System's property, which will use by log4j 
      System.setProperty("currentDate", new SimpleDateFormat("dd-MMM-yyyy").format(new Date())); 
     } catch (UnknownHostException e) { 
      System.out.println("Error Message : " + e.getMessage()); 
      //e.printStackTrace(); 
     } 


    } 


} 

......

Установите файл log4j.xml Аналогично,

<appender name="applog" class="org.apache.log4j.DailyRollingFileAppender"> 
     <param name="File" value="${path}/app_${hostName}.${currentDate}.log" /> 
     <param name="MaxFileSize" value="1MB" /> 
     <param name="DatePattern" value=".dd-MM-yyyy" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="[%d{dd-MM-yyyy HH:mm:ss}] [%-5p] %m%n"/> 
     </layout> 
</appender> 

пожалуйста, веб-обновления. xml-файл соответственно,

<web-app ...> 
    <listener> 
    <listener-class> 
      com.pck1.ApplicationConfiguration 
     </listener-class> 
    </listener> 
</web-app> 

Эта конфигурация должны применяться в web.xml, потому что приложение при запуске, с помощью этой конфигурации она будет следовать за ним, как Контекст-слушателя.


UPDATE 2:

<logger name="packageName.AAA" additivity="false" > 
    <level value="INFO" /> 
    <appender-ref ref="applog"/> 
</logger> 
+0

Фактически log4j вызывает вызов, когда приложение запускается. –

+0

@ Ваше приложение - это веб-приложение? –

+0

Да, это веб-приложение ... tomcat - сервер приложений –

1

Cf. это response к аналогичному вопросу, запрос не был бы очевидным, даже если в соответствии с этим списком рассылки thread это давний запрос.

Использование последней версии log4j, конец этой документации section кажется, что у вас уже есть функция, доступная с использованием свойств.

В любом случае, у вас всегда есть решение сделать это самостоятельно с помощью специализированного макета шаблона, например here.

+0

спасибо за ответ, но для меня главная проблема: у меня есть два журнала для одного и того же пакета, но если он исходит из моего пользовательского класса он должен записываться в один журнал, если он исходит из другого класса, он должен писать другому. –

1

Вы можете определить системное свойство hostname и изменить конфигурацию:

<param name="File" value="${path}/app_${hostname}.log" /> 

Убедитесь, что свойство системы устанавливается до инициализации log4j.

Для добавления фильтра смотрите ответ на Filter log by matching pattern - log4j

ОБНОВЛЕНО: Простое решение для записи другого журнала:

<logger name="com"><!-- for Class Package is com.???... --> 
    <level value="INFO" /> 
    <appender-ref ref="applog" /> 
</logger> 
<logger name="loggerForCustomClass"> 
    <level value="INFO" /> 
    <appender-ref ref="customlog" /> 
</logger> 

Изменить код в вашей программе:

//message will write to "customlog" appender 
Logger.getLogger("loggerForCustomClass").info("log from custom class"); 

//message will write to "applog" appender 
Logger.getLogger(getClass()).info("log from other class"); 
+0

спасибо за ответ, но для меня главная проблема в том, что у меня есть два журнала для одного и того же пакета, но если он исходит из моего пользовательского класса, он должен писать в один журнал, если он исходит из другого, кроме этого класса, он должен писать другому. –

1

Следующая конфигурация сделает трюк

<appender name="file" class="org.apache.log4j.RollingFileAppender"> 
     <param name="append" value="false" /> 
     <param name="maxFileSize" value="10MB" /> 
     <param name="maxBackupIndex" value="10" /> 
     <param name="file" value="C:\\Users\\kavurira\\Desktop\\log4j-${HostName}.log" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" 
      value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m${HostName}%n" /> 
     </layout> 
    </appender> 

Just set "HostName" as system property, before initialization of Log4j. 

System.setProperty("HostName", InetAddress.getLocalHost().getHostName()); 
+0

где установить свойство hostname, у меня нет сервлета (загрузка при запуске) ...? –

+0

Не нужно загружать при запуске, должен быть вход или какой-то запуск вашего проекта? Вы должны установить свойство в своем проекте, прежде чем выполнять следующую строку в своем проекте. Logger logger = Logger.getLogger («classname») –

+0

Я попытался ... но в моем случае файлы журнала генерируются при запуске приложения ... его не принимает имя –

0

Напишите вам собственный пользовательский расширитель, распространяющий основные приложения. Это поможет вам манипулировать свойствами в java.

See Этот ответ https://stackoverflow.com/a/1324075/1594992

или просто набор аргументов командной строки & свойство системы, как этот ответ

https://stackoverflow.com/a/4953207/1594992

+0

log4j будет загружаться при запуске приложения, поэтому, как определить систему.setProperty –

+0

Как вы называете log4j, у вас есть базовый класс? Если это так, вы можете установить свойство там – Sam

+0

Log4j инициализируется после весны boot.INFO: Инициализация корня Spring WebApplicationContext log4j: WARN –

4

После log4j2 documentation вы можете сделать переменную окружения Lookups, так и в Unix-подобных системах это должно работать:

<Property name="MYHOST">${env:HOSTNAME}</Property> 
<Appenders> 
    <File name="File1" fileName="${MYHOST}_file.log"> 
    ... 
    </File> 
</Appenders> 

Осторожно что $ HOSTNAME не всегда доступен по умолчанию, и вам может потребоваться явно его экспортировать. i n оболочка, см. this post.

Смежные вопросы