LINUX.ORG.RU

Почистить активный лог. Как?

 


0

1

Всем привет!

Пользуюсь log4cplus. Есть ситуация, когда надо удалить все логи. Просто тупо удаляю лог-файлы и получаю следующую фишку: новые лог сообщения показываются в консоли,но лог файл не создаётся. Надо перегрузить прибор и тогда новые лог сообщения пишутся в файл. Уже замучался искать, откуда ноги растут. Может кто с подобным встречался и пнёт советом? Вот мой файл с настройками лога:

# specific loggers
log4cplus.logger.serviceLogger=TRACE, stdout_Service, file_Service
log4cplus.additivity.serviceLogger=false

# Service logger messages
log4cplus.appender.stdout_Service=log4cplus::ConsoleAppender
log4cplus.appender.stdout_Service.layout=log4cplus::PatternLayout
log4cplus.appender.stdout_Service.layout.ConversionPattern=%d{%H.%M.%S} %m%n

log4cplus.appender.file_Service=log4cplus::RollingFileAppender
log4cplus.appender.file_Service.File=/mnt/data/maintenance/service.log
log4cplus.appender.file_Service.MaxFileSize=100KB
log4cplus.appender.file_Service.MaxBackupIndex=1
log4cplus.appender.file_Service.layout=log4cplus::PatternLayout
log4cplus.appender.file_Service.layout.ConversionPattern=%d{%d.%m.%y %H.%M} %m%n

Заранее спасибо velik


Ответ на: комментарий от ddt

Спасибо за идею. Делаю touch service.log. Файл появляется, но остаётся нулевой длины, когда появляются сообщения. Т.е. тупо игнорируются. Перезагрузил, опять работает, как надо. Чё за?? :)

velikS ()
Ответ на: комментарий от emulek

logrotate нету. Всё в embedded. Ротация файлов через

log4cplus.appender.file_Service.MaxFileSize=100KB
log4cplus.appender.file_Service.MaxBackupIndex=1

Т.е. он сам создаёт 1 файл. Это уже проверено - работает. Не работает, как говорю, всё почистить, и чтоб писал дальше логи без перезагрузки

velikS ()
Ответ на: комментарий от velikS

В линуксе файлы удаляются тогда, и только тогда, когда

У файла не осталось имён

Все приложения закрыли файл.

У вас файл без имён, но не закрытый. Его можно посмотреть в /proc/PID/fs/ или командой lsof.

emulek ()
Ответ на: комментарий от emulek

Ok, спасибо за идею. Ваша правда... он действительно открытый библиотекой, но удалённый (мной лично через rm service.log).

/proc/1/fd # ls -al
total 0
l-wx------    1 root     root            64 Jan  8 14:59 7 -> /mnt/data/maintenance/service.log (deleted)

Но как-то от этого не легче :)) Интересно, как для log4cplus сказать, чтоб он «переоткрыл» файл?

velikS ()
Ответ на: комментарий от velikS

rm удаляет только имя, но не сам файл.

Интересно, как для log4cplus сказать, чтоб он «переоткрыл» файл?

повторяю: обычно надо сигнал HUP послать. Но не обязательно, вплоть до рестарта(демона, пишущего в лог).

emulek ()
Ответ на: комментарий от emulek

log4cplus это - библиотека, а не демон или что ещё. Ей нельзя послать сигнал. Демон, пишущий в лог - инит процесс системы, его не перезапустить ))

velikS ()
Ответ на: комментарий от velikS

ну я без понятия, если нет такой фичи, то у вас кроме как truncate вариантов и нет.

truncate отсутствует в busybox

достаточно открыть и закрыть файл с O_TRUNC

man 2 open

O_TRUNC If the file already exists and is a regular file and the open mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise the effect of O_TRUNC is unspecified.

emulek ()
Ответ на: комментарий от emulek

Спасибо за идеи. Я тут в глубоком дебаге этой библиотеки. А вот и первый звоночек!в библиотеке есть такая фишка:


void
FileAppender::append(const spi::InternalLoggingEvent& event)
{
    if(!out.good()) {
        if(!reopen()) {
            getErrorHandler()->error(  LOG4CPLUS_TEXT("file is not open: ") 
                                     + filename);
            return;
        }

где

log4cplus::tofstream out;

и

typedef std::basic_ofstream<tchar> tofstream;

Т.е. они переоткрывают файл если if(!out.good()) Так вот нифига оно не работает )) Т.е. проскакивает кусок в котором должно переоткрыть файл и пытается писать в плохой basic_ofstream. Зашибись! :-)

velikS ()
Последнее исправление: velikS (всего исправлений: 1)
Ответ на: комментарий от velikS

Если у тебя есть доступ к сырцам приложения, которое пишет логи - просто напиши обработчик для SIGHUP, который будет переоткрывать поток записи - это не сложно. Примеры можешь найти в любом демоне, который сам пишет логи - например в том же Squid

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от velikS

Т.е. они переоткрывают файл если if(!out.good()) Так вот нифига оно не работает )) Т.е. проскакивает кусок в котором должно переоткрыть файл и пытается писать в плохой basic_ofstream. Зашибись! :-)

тебе выше же уже писали про inode и что filename != filedata?

exception13 ★★★★★ ()
Ответ на: комментарий от Pinkbyte

Так примерно этим сейчас и занимаюсь - ищу (даже, кажется, уже нашёл) баг в библиотеке и бытаюсь пофиксить. Но там никакие сигналы не нужны. Похоже, всё проще - тупо баг в библиотеке. Хорошо, что в открытых исходниках ))

velikS ()
Ответ на: комментарий от Legioner

вангую что echo ничего не сделает write т.к. нет в аргументах строки

exception13 ★★★★★ ()
Ответ на: комментарий от exception13

Чесс слово не работает ))

/mnt/data/maintenance # rm service.log 
/mnt/data/maintenance # ls -al
total 0
drw-rw-rw-    2 root     root           160 Jan  8 17:33 .
drwxr-xr-x    9 root     root           712 Jan  8 17:25 ..
/mnt/data/maintenance # echo 'test' > service.log
/mnt/data/maintenance # ls -al
total 4
drw-rw-rw-    2 root     root           232 Jan  8 17:33 .
drwxr-xr-x    9 root     root           712 Jan  8 17:25 ..
-rw-r--r--    1 root     root             5 Jan  8 17:33 service.log
/mnt/data/maintenance # Appender::doAppend
****** RollingFileAppender::append
****** FileAppender::append1
/mnt/data/maintenance # ls -al
total 4
drw-rw-rw-    2 root     root           232 Jan  8 17:33 .
drwxr-xr-x    9 root     root           712 Jan  8 17:25 ..
-rw-r--r--    1 root     root             5 Jan  8 17:33 service.log

Не добавляет в него библмотека ничего. Она должна этот out.close() а потом out.open() вызвать, но она не определяет этот out как !good()

velikS ()
Ответ на: комментарий от velikS

Truncate это фича оболочки, связанная с перенаправлением потока внутрь файла. Емнип она в posix приписана.

И да, 'проскакивает' у вас видимо потому, что поток вполне хороший. То, что имя файла удалено ничего не значит. Имя файла к файлу НЕ относится, оно только при открытии нужно. А команда rm удалит только имя файла, но не сам файл.

emulek ()
Ответ на: комментарий от exception13

балда. ты зачем rm service.log делаешь?

Так библиотека не даёт функции почистить лог. Ну ладно. Пошёл я домой )) Всем спасибо!

velikS ()
Ответ на: комментарий от emulek

Всё правильно ваша либа делает. Просто вы не понимаете, как работает rm. Она НЕ удаляет файл, только его имя.

Спасибо, я это уже тоже понял.

velikS ()
Ответ на: комментарий от exception13

Да уже понял, в чём моя глупость была. Всем спасибо за советы.

velik

velikS ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.