Лучшие практики для Java, регистрирующегося от нескольких потоков?

Entity Framework (Model-First) создает для вас файл кода. Любые изменения, которые вы вносите в этот файл, будут потеряны при следующем генерировании. Существует даже предупреждение об этом в комментарии в верхней части файла.

Однако эти классы отмечены partial (поскольку большинство сгенерированных классов), поэтому вы можете имеют отдельный файл кода, который содержит оставшуюся часть определения класса (т. е. ваши методы). См. MSDN для получения дополнительной информации о частичных классах .

Вы также можете записать другие классы, которые принимают объекты данных в качестве параметров. Обычно это , как вы это делаете, поскольку объекты EF обычно оставляют только данные.

25
задан Jason S 19 February 2009 в 16:52
поделиться

11 ответов

Используйте платформу журналирования, такой как Log4j.

21
ответ дан Aaron Digulla 15 October 2019 в 15:07
поделиться

Я думаю, что Вы находитесь на неправильном пути. Вы говорите, что “threadsafe”, но Вы на самом деле имеете в виду “serialized”. Ориентированный на многопотоковое исполнение означает, что один поток не вмешается в данные из другого потока. Большую часть времени распараллеливающие вопросы решены заранее, и Вы не должны волноваться об этом только для входа пользы. Например, если Ваша запись:

myVariableSum = 0 + myVariable;
//here comes other thread - Not very likely!
logger.info("Log some INFO; myVariable has value" + myVariable.toString());

необходимо удостовериться, что myVariable не был изменен некоторым другим потоком от вычисления момента (первая строка) был выполнен, но прежде чем регистрирующийся метод назвали. Если это произойдет, то Вы зарегистрируете грязное значение, которое не использовалось для выполнения операции, но значения, которое было присвоено некоторым другим потоком. Это обычно заботится о; например, локальный (уровень метода) переменная не может быть заменена другим потоком. Так или иначе, если необходимо волноваться об этом при входе, чем 99%, что программа уже имеет серьезные проблемы поточной обработки.
Все главные платформы журналирования являются собой “threadsafe”, означающим, что они могут быть развернуты в многопоточных средах и не отобразят проблемы, подобные одному описанному выше внутренне.
Получение трассировок появиться во входит в систему, приказывают, чтобы они произошли, на самом деле обычно называется “serialization” вызовов. Сериализация записей журнала будет главным узким местом производительности на любом многопоточном приложении. При использовании платформы журналирования, как log4j, трассировки от всех потоков появятся в единственном месте более или менее в порядке, они происходят. Однако один столбец обычно является именем Потока, таким образом, можно легко отфильтровать данные логов потоком; каждый поток будет регистрировать свои данные в хронологическом порядке. Проверьте эту ссылку: http://logging.apache.org/log4j/1.2/faq.html#1.7
Наконец, при сериализации записей журнала - то, в чем Вы действительно нуждаетесь, затем Вы могли использовать некоторую структуру, как java.util.concurrent. BlockingQueue для маршрутизации сообщений.

22
ответ дан Dan 15 October 2019 в 15:07
поделиться

Я склонен использовать SLF4J сверху Log4J. параметризованный вход функциональность особенно привлекательна, если Вы собираетесь иметь много регистрирующихся операторов, которые могут быть выключены в продуктивной среде.

Это может также работать поверх java.util.logging или использовать свой собственный простой вывод.

5
ответ дан Evan 15 October 2019 в 15:07
поделиться

Вы могли использовать механизмы синхронизации (как монитор или semaphor) для проверки, что один запрос журнала обрабатывается прежде, чем принять следующее. Это могло все быть скрыто от кода, назвав регистрирующиеся стандартные программы.

5
ответ дан jpfollenius 15 October 2019 в 15:07
поделиться

Используйте каркас журналирования, такой как Log4.

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

4
ответ дан Jens Schauder 15 October 2019 в 15:07
поделиться

Используйте платформу журналирования, которая реализует некоторую форму шаблон NDC , как Log4J.

4
ответ дан eljenso 15 October 2019 в 15:07
поделиться

log4j является и был стандартом для ведения журналов Java в течение многих лет. Но если вам не нравится внешняя зависимость, то пакет java.util.logging предоставляет приемлемое решение.

3
ответ дан Gareth Davis 15 October 2019 в 15:07
поделиться

Если бы вам пришлось, вы могли бы бросить свой собственный .. используя FIFO с одним писателем / одним читателем или очередями.

1
ответ дан JustJeff 15 October 2019 в 15:07
поделиться

Разработка этого самостоятельно ориентированным на многопотоковое исполнение способом не тривиальна, таким образом, необходимо действительно использовать существующую платформу журналирования, которая ориентирована на многопотоковое исполнение. Обычно используемый - Log4J, который ориентирован на многопотоковое исполнение (см. FAQ).

0
ответ дан Christian Berg 15 October 2019 в 15:07
поделиться

Это старый вопрос, но вот мое решение, использующее Log4J программно.

LogFactory class

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import java.util.Properties;

public class LogFactory {

    private final static ThreadLocal<Logger> logFactory = new ThreadLocal<>();

    public static void createNewLogger(String className) {

        Logger log = Logger.getLogger("Thread" + className);

        Properties props = new Properties();
        props.setProperty("log4j.appender.file", "org.apache.log4j.RollingFileAppender");

        props.setProperty("log4j.appender.file.maxFileSize", "100MB");
        props.setProperty("log4j.appender.file.Append", "false");
        props.setProperty("log4j.", "100MB");
        props.setProperty("log4j.appender.file.maxBackupIndex", "100");
        props.setProperty("log4j.appender.file.File", "logs/" + className + ".log");
        props.setProperty("log4j.appender.file.threshold", "info");
        props.setProperty("log4j.appender.file.layout", "org.apache.log4j.PatternLayout");
        props.setProperty("log4j.appender.file.layout.ConversionPattern", "%d{yyyy-MM-dd HH-mm-ss} | %-5p | %C{1}:%L | %m%n");
        props.setProperty("log4j.appender.stdout", "org.apache.log4j.ConsoleAppender");
        props.setProperty("log4j.appender.stdout.Target", "System.out");
        props.setProperty("log4j.logger." + "Thread" + className, "INFO, file");
        PropertyConfigurator.configure(props);
        logFactory.set(log);
    }

    public static Logger getLogger() {
        return logFactory.get();
    }

}

Затем для инициализации регистратора используйте следующий подход

logFactory.createNewLogger(String.valueOf(Thread.currentThread().getId()));
logFactory.getLogger().info(" TEST . Thread id is: " + id);
0
ответ дан KahunaDub 15 October 2019 в 15:07
поделиться

Использовать классический логбэк. Это более новая и лучшая реализация log4j.

9
ответ дан 28 November 2019 в 06:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: