Реализация ведения журнала - PullRequest
2 голосов
/ 23 августа 2011

Мне просто интересно, существует ли следующая вещь.

У меня есть TCP-коммуникатор, который поддерживает связь с тысячами устройств.

В настоящее время коммуникатор TCP записывает все события в один файл журнала.

Теперь можно ли регистрировать связь с каждым устройством в разных файлах.Номер IMEI каждого устройства отличается.Таким образом, регистратор проверит, существует ли файл с именем, равным номеру IMEI устройства.Если файл существует, регистратор начнет регистрировать события устройства в этом файле, в противном случае он создаст новый файл с IMEI в качестве имени файла и начнет регистрировать события в этом файле.

(Мы разрабатываем нашприложение на Java.)

Ответы [ 4 ]

3 голосов
/ 23 августа 2011

LogBack - это будущее, и оно здесь!

Созданный как преемник log4j и полностью жалобный с фреймворком slf4j, logback может быть простым (и чистым) способом выполненияваша потребность.

Я не эксперт, но я думаю, что SiftingAppender может быть правильным ответом.Должен быть вариант дискриминатора для вас.Возможно, вы можете создать свой собственный дискриминатор, расширить SiftingAppender или получить дополнительную помощь из библиотеки Janino.

Надеюсь, это поможет!

1 голос
/ 23 августа 2011

Если вы используете Apache log4j , который я настоятельно рекомендую, создайте пользовательское приложение для ведения журнала, расширив AppenderSkeleton , и написание уникальных файлов для отдельных подключений будет столь же простым, как и стандартное Ввод / вывод файла с именем переменной.

1 голос
/ 23 августа 2011

Если вы сами внедряете регистратор, вам ничто не помешает.
Например, укажите в качестве параметра функции log номер устройства, с которым вы сейчас общаетесь, и реализуйте его так, как вы описали.

0 голосов
/ 23 августа 2011

Если вы используете java.util.logging, посмотрите на Handler базовый класс , если вы используете log4j, посмотрите на Appender. В обоих случаях вам необходимо каким-либо образом связать IMEI с сообщением, чтобы код, пишущий сообщение журнала, мог выбрать соответствующий файл.

Есть два подхода к этому.

Сначала необходимо расширить класс событий журнала (LogRecord или LoggingEvent соответственно). Это позволит вам войти, используя ваше событие, которое содержит IMEI. Однако это не учитывает регистрацию, выполняемую другими библиотеками и т. Д. При выполнении диалога с устройством.

Другой альтернативой является использование ThreadLocal. Установите IMEI, связанный с сокетом, всякий раз, когда вы получаете сообщение или формулируете сообщение. Убедитесь, что ведение журнала происходит в одном и том же потоке, а все очереди выполняются в обработчике / приложении журнала. Ищите / задавайте вопросы о ThreadLocals, если вы не знакомы с этим подходом. Я считаю, что в Log4J NDC и MDC реализована такая стратегия, но я не пытался выполнять специализированную обработку контекста у аппендера.

Наконец, имейте в виду, что в некоторых операционных системах не хватает файловых дескрипторов, если вы действительно хотите оставить «тысячи» файлов журналов открытыми. В зависимости от того, сколько файлов, вы можете рассмотреть возможность записи сообщений журнала (с IMEI) в базу данных или выполнения своего рода закрытия файлов на основе LRU. В последнем случае у вас практически не было бы файловых дескрипторов для файлов журналов, которые не были затронуты некоторое время.

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