Как использовать log4j в многопоточности с использованием Java? - PullRequest
4 голосов
/ 22 ноября 2011

Я хочу записать журнал для каждого потока, используя log4j, и имя файла журнала будет "workthread..log", первый поток печатает журнал в файле "workthread-1.log" и второй поток в "workthread-2.log"и так далее.

class MyRunnable implements Runnable 
  {
       private Logger logger=null;

       public MyRunnable()
        {
            DOMConfigurator.configure(this.getClass().getClassLoader().getResource(LOG4J_FILEPATH));
            logger =Logger.getLogger(classname);
        }

        public void run() 
        {
          logger.info("Important job running in MyRunnable"+Thread.currentThread().getName());
        }
   }


public class TestThreads 
{
    public static void main (String [] args) 
     {
        Thread[] worker=new Thread[3];
        MyRunnable r = new MyRunnable();

        for(int i=0;i<3;i++) {
           worker[i]=new Thread(r);
           worker[i].start();
        }


    }
}//class

пожалуйста, помогите мне?

С уважением

Ответы [ 5 ]

4 голосов
/ 22 ноября 2011

вы можете использовать MDC

MDC.put (ключ, значение); - в коде

и% X {ключ} - в поле имени файла в файле конфигурации log4j

2 голосов
/ 22 ноября 2011

возможно, вы могли бы попробовать что-то вроде этого:

logger = Logger.getLogger(classname);
logger.removeAllAppenders();                                        
logger.addAppender(new FileAppender(layout, "your-thread-name.log", true)); 

вы можете получить имя вашей темы с чем-то вроде "thread.getName ()", я думаю;)

1 голос
/ 22 ноября 2011

это то, как я использую потоковый логгер.Просто скопируйте вставить, и он поверх метода запуска и должен работать как есть.Не забудьте поменять текст заглавными буквами.

String currenttime = String.valueOf(new Long(new Date().getTime()/1000));
String logFileName = "NAMEHERE_thread" + Thread.currentThread().getId() 
                     + "_" + currenttime+".log";
Logger logger = Logger.getLogger("NAMEHERE_thread" +
                                      Thread.currentThread().getId() + "_"+ currenttime);

Properties prop = new Properties();
prop.setProperty("log4j.logger.NAMEHERE_thread" + Thread.currentThread().getId() 
                 + "_" + currenttime,"DEBUG, file");

prop.setProperty("log4j.appender.file", "org.apache.log4j.RollingFileAppender");
prop.setProperty("log4j.appender.file.maxFileSize", "100MB");
prop.setProperty("log4j.appender.file.maxBackupIndex", "100");
prop.setProperty("log4j.appender.file.File", 
                 REPLACEMEWITHPATH + File.separator + logFileName);
prop.setProperty("log4j.appender.file.threshold","debug");
prop.setProperty("log4j.appender.file.layout", "org.apache.log4j.PatternLayout");
prop.setProperty("log4j.appender.file.layout.ConversionPattern", 
                 "%d [%t] %-5p [%-35F : %-25M : %-6L] %-C -%m%n");
prop.setProperty("log4j.appender.stdout", "org.apache.log4j.ConsoleAppender");
PropertyConfigurator.configure(prop);
1 голос
/ 22 ноября 2011
  1. Реализация нового приложения для ведения журнала, которое управляет FileAppender для различных потоков и файлов. Используйте для этого AppenderSkeleton, сохраняйте карту для FileAppenders.

    public MultiThreadAppender extends AppenderSkeleton {
        public final static String THREAD_KEY = "THREAD_NO";
        private Map<String, FileAppender> fileAppenders;
    }
    
  2. Используйте MDC для определения различных потоков. Используйте ключ, такой как «THREAD_NO», поместите в MDC (MDC.put), когда поток впервые вызовет регистратор, и проверьте этот ключ, чтобы получить FileAppender для него. Вот пример:

    protected void append(LoggingEvent event) {
        Object value = event.getMDC(THREAD_KEY);
        FileAppender appender;
        if (value instanceof String && ((String) value).length() > 0) {
            appender = fileAppenders.get(value);
        } else {
            value = nextThreadNo();
            fileAppenders.put(value, new FileAppender(...)); //
        }
    }
    
1 голос
/ 22 ноября 2011

Вы можете инициализировать каждое поле logger экземпляром, используя LogManager.getLogger(Class) метод .Используя различные приложения для добавления текстовых файлов, вы можете записать строки журнала в текстовый файл с соответствующими именами.

В случае, если каждый поток использует собственную реализацию Runnable (?), Это должно работать.Если это не так, попробуйте использовать ThreadLocal<Logger> как logger и заполните его, используя LogManager.getLogger(String) с уникальным для всех нитей именем.

См. Также Краткое введение в log4j: Ceki Gülcü, Март 2002 года на случай, если вам понадобится пример настройки дополнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...