Я также сталкиваюсь с этой проблемой, но только из-за сильной компоновки виджетов. Макет виджетов должен быть таким же легким, как вы можете создать. Теперь мой виджет работает идеально.
Можно ли передать системное свойство Java для каждого задания? Если так, можно параметризовать как это:
java -Dmy_var=somevalue my.job.Classname
И затем в Вашем log4j.properties:
log4j.appender.A.File=${my_var}/A.log
Вы могли заполнить системное свойство Java со значением от среды хоста (например), которая однозначно определит экземпляр задания.
Если имена задания знаются заранее, Вы могли бы включать имя задания, когда Вы делаете getLogger () вызов. Тогда можно связать другой appenders с различными регистраторами с отдельными именами файлов (или другие места назначения).
, Если Вы не можете знать имя задания заранее, Вы могли бы настроить регистратор во времени выполнения вместо того, чтобы использовать конфигурационный файл:
FileAppender appender = new FileAppender();
appender.setFileName(...);
appender.setLayout(...);
Logger logger = Logger.getLogger("com.company.job."+jobName);
logger.addAppender(appender);
У нас есть что-то подобное, реализованное в нашей системе. Мы храним определенные регистраторы в HashMap и инициализируем appenders для каждого из них по мере необходимости.
Вот пример:
public class JobLogger {
private static Hashtable<String, Logger> m_loggers = new Hashtable<String, Logger>();
private static String m_filename = "..."; // Root log directory
public static synchronized void logMessage(String jobName, String message)
{
Logger l = getJobLogger(jobName);
l.info(message);
}
public static synchronized void logException(String jobName, Exception e)
{
Logger l = getJobLogger(partner);
l.info(e.getMessage(), e);
}
private static synchronized Logger getJobLogger(String jobName)
{
Logger logger = m_loggers.get(jobName);
if (logger == null) {
Layout layout = new PatternLayout("...");
logger = Logger.getLogger(jobName);
m_loggers.put(jobName, logger);
logger.setLevel(Level.INFO);
try {
File file = new File(m_filename);
file.mkdirs();
file = new File(m_filename + jobName + ".log");
FileAppender appender = new FileAppender(layout, file.getAbsolutePath(), false);
logger.removeAllAppenders();
logger.addAppender(appender);
}
catch (Exception e)
{ ... }
}
return logger;
}
}
Затем для использования этого в задании просто необходимо использовать одну запись строки как это:
JobLogger.logMessage(jobName, logMessage);
Это создаст один файл журнала для каждого имени задания и отбросит его в его собственном файле с тем именем задания в том, какой бы ни каталог Вы определяете.
можно играть с другими типами appenders и такого, как записано он продолжит добавлять, пока JVM не перезапущена, который не может работать, если Вы выполняете то же задание на сервере, который является всегда, но это дает общее представление о том, как он может работать.
Вы можете иметь каждый NDC набора задания или MDC и затем записать appender, который варьируется имя на основе значения MDC или NDC. Создание нового appender не слишком трудно. Может также быть appender, который будет отвечать всем требованиям в песочнице log4j. Начните смотреть в http://svn.apache.org/viewvc/logging/log4j/trunk/contribs/
Вы могли записать свой собственный appender, который составляет его собственное имя файла, возможно, с помощью [File.createTempFile] ( http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html#createTempFile (java.lang. Строка, %20java.lang. Строка)) метод. Если бы FileAppender
класс был записан правильно, то необходимо быть в состоянии расширить it— или RollingFileAppender
— и переопределите getFile
метод для возврата того, который Вы выбираете на основе любых новых свойств, которые требуется добавить.
можно реализовать следующее:
я могу отправить Вам некоторый код почтой, если Вы желаете...
Tom Вы coud определяет и appenders для каждого задания. Позвольте нам, что у Вас есть 2 задания, соответствующие двум различным пакетам Java com.tom.firstbatch и com.tom.secondbatch, у Вас было бы что-то вроде этого в log4j.xml:
<category name="com.tom.firstbatch">
<appender-ref ref="FIRST_APPENDER"/>
</category>
<category name="com.tom.secondtbatch">
<appender-ref ref="SECOND_APPENDER"/>
</category>
Вы могли программно настроить log4j при инициализации задания.
можно также установить log4j.properties файл во времени выполнения через системное свойство. От руководство :
Набор строковая переменная ресурса к значению системное свойство log4j.configuration . Предпочтительный способ определить файл инициализации по умолчанию через log4j.configuration системное свойство. В случае, если системное свойство log4j.configuration не определяется, затем установило ресурс строковой переменной на свое значение по умолчанию "log4j.properties".
Принятие Вы выполняете задания от различных команд Java, это позволит им использовать различные log4j.properties файлы и различные имена файлов для каждого.
Без специальных знаний того, как Ваши задания выполняются, трудно сказать!