LINUX.ORG.RU

Помогите создать логгер

 


0

4

Помогите создать логгер по данному заданию. Написать логгер для многопоточной среды.

Общая информация:

Логгер - это некий канал для передачи сообщений или информационных данных (сообщения об ошибках, вспомогательные данные для отладки и т.д.) из приложения и сохранения их для последующей обработки и анализа. В общем случае, данные могут передаваться куда-то по сети или записываться в файл на машине. У каждого сообщения есть уровень логирования (log level). Уровень логирования указывает важность принимаемых сообщений. Обычно уровни логирования бывают такие: *CRITICAL: Информация о критических ошибках * ERROR: Информация об ошибках возникших при работе приложения *WARNING: Информация о мелких проблемах возникших при работе приложения * INFO: Общая информация * DEBUG: Логирование информации для последующего использования в отладке

Задача:

Написать простейший логгер (набор структур и функций для С или класс для С++), который записывает логгируемые данные (только текст) из программы в текстовый файл на компьютере, где он запущен.

Логгер должен: * Логгировать только текстовую информацию. * Каждая запись должна содержать: - время когда она была сделана в формате «YYYY-MM-DD HH:MM:SS» - уровень логирования, с которым запись была помещена в лог. * Логгер должен работать в многпоточной среде, то есть несколько потоков должны иметь возможность писать в лог (один и тот же файл).

Необходимо так же написать простейшее консольное тестовое приложение к логгеру.

Использовать можно, либо С, либо С++, на выбор. Желательно под Linux, но можно и под Windows. Можно использовать любую доступную среду разработки и компилятор С или С++.

Или подскажите где почитать. Проблема в том, что с подобного рода задачами не сталкивался НИКОГДА. Поэтому даже не знаю с чего начинать.



Последнее исправление: cetjs2 (всего исправлений: 1)

в задании нехватает 3-го раздела: «Стоимость и порядок оплаты» :)

MKuznetsov ★★★★★
()

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

hatefu1_dead
()

язабан!

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

а читать кернигана и ричи, стивенса, и man 3 syslog, и можно загуглить про логгеры разные.

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

Да не лень )) я же не прошу написать за меня ))) Не знаю с чего начать. Читаю готовый логгер http://www.scaiper.ru/?p=457 и не втыкаю Опыта и знаний не хватает И всё получится, потому как я уже пытаюсь ))))

Globus_lord
() автор топика

Давай разберемся в следующих вопросах:

1. Что ты знаешь из C/C++?

2. Какие проекты ты делал? Хотя бы описание. Что ты непосредственно писал (какие участки кода и за что они отвечали)?

3. Есть ли понятие о многопоточности, race-conditions и борьбы с ними, singleton?

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

это даже с натягом не тянет на курсовую.

anonymous
()

тестовое приложение должно обращаться к логгеру, или логгер должен рыться в чужом процессе?

в первом случае я бы написал web сервер, который парсит GET-запросы и складирует все данные в бд. на php это заняло бы строчек 10

второй бы в сжатые сроки ниасилил бы. но очевидно, что начинать надо с межпроцессового взаимодействия (D-Bus)

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

Оооо, классно )))) 1)Учил C++ в академии в рамках арифметики и т.п. 2)Когда то писал программу для дяди в Билдере, она считала и печатала в файл результаты, а также выводила на печать. А так опыт, к сожалению, ОЧЕНЬ ограниченный. Сейчас учу Java (начал правда правда недавно, только 4 занятия из 15) на курсах. 3) Все три слова... к сожалению мало что значат для меня, пока что.

Но я очень быстро учусь. Честно ))) Поэтому дайте пинка, но только с вектором ))))

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

Ребят, это тестовое задание. Поэтому сделать я его ОЧЕНЬ хочу САМ. Но не знаю как )))) Сделать нужно в короткие сроки, ну желательно в короткие сроки. Скажите, что читать. (Кернинга и Ричи уже начал читать))) спасибо hatefu1_dead )) )

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

1. Попытайся создать приложение, которое что-то пишет в файл.

2. Попытайся оформить класс, который будет предоставлять методы для записи в файл.

3. Попытайся реализовать простейшее многопоточное приложение (любое, пример тьма в интернетах).

4. Попытайся многопоточно писать в один и тот же файл.

5. Почитай о race-conditions, мьютексах, и попробуй свой метод/класс сделать потоково-безопасным.

6. Сделай его singleton'ом.

Документации и примеров в интернете завались. Попытайся сделать хоть что-то, и понять, почему оно так работает (не тупо копируя-вставляя-компилируя).

Пусть местные меня поправят, если что.

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

дополнительно можешь разобраться с текстовыми потоками (stream'ами)

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

Андрей, спасибо, за реальный совет. Сераф... Это самое простое и, наверное, самое глупое решение )))) Я же хочу совместить выполнение тестового задания с самообразованием, но спасибо за щедрое предложение и инфу (теперь я знаю, сколько должно занимать времени выполнение подобного задания)

Globus_lord
() автор топика

Демон с UNIX-сокетом, библиотека с функцией логгирования которая коннектится к сокету и отправляет в него сообщение

/endthread

no-dashi ★★★★★
()
Ответ на: комментарий от Globus_lord

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

invy ★★★★★
()
Ответ на: комментарий от no-dashi

+1 к демону с юникс-сокетом. элементарно и юникс-вейно

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

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

а пусть гадят. Если размер записи в файл открытый для добавления (O_APPEND) не более 512и байт, то процесс добавления атомарен, и вполне корректно работает. man 2 open до полного просветления.

drBatty ★★
()

Если не заморачиваться - сделай простой код записи в файл и оберни его мютексами, чтобы только один поток мог выполнять эту секцию. Если заморачиваться - сделай поток-логгер и многопоточную очередь сообщений. Запись в лог - добавление сообщения в очередь. Если очередь очень большая, то повесить потк пока место не освободится. А поток логгер выбирает сообщение из очереди и пишет его в файл. Таким образом пока хватает скорости диска для записи, логгирование будет очень быстрое и потоки не будут мешать друг другу. Можно поэкспериментировать с lock-free алгоритмами для очереди сообщений.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)

Поэтому даже не знаю с чего начинать.

для начала попросить модераторов перенести тему в раздел Job.

qnikst ★★★★★
()

singleton, priority_queue, sockets, multi-threads.
Заюзай буст, если можно конечно)

Boy_from_Jungle ★★★★
()

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

Boy_from_Jungle ★★★★
()

Оу шит. Ну какие там синглтоны, бусты и прочая херня? fprintf() и сородичи в glibc (и только в glibc, за другие реализации не ручаюсь) потокобезопасны. То есть простая функция логгирования, которая внутри делает printf(«%s\n», msg); И всё. Только в документации обязательно указать, что завязка на GNU libc.

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

Ну про это ничего в задании не сказано. Поэтому ограничения, как я писал выше, можно смело указать в документации и не париться.

Ну на самом деле, потокобезопасный printf() реализуется самостоятельно с помощью одного мьютекса за пару минут.

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

согласен, можно и так и сяк, тут уже дело вкуса можно сказать.

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

fprintf() и сородичи в glibc (и только в glibc, за другие реализации не ручаюсь) потокобезопасны.

неа. только для добавления и если не более размера блока. если ты не согласен - кинь пруф плз.

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

в первом случае я бы написал web сервер, который парсит GET-запросы и складирует все данные в бд. на php это заняло бы строчек 10

Мозг пыхеров, походу, вообще не способен в in-process.

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

пруф

The POSIX standard requires that by default the stream operations are atomic. I.e., issuing two stream operations for the same stream in two threads at the same time will cause the operations to be executed as if they were issued sequentially. The buffer operations performed while reading or writing are protected from other uses of the same stream. To do this each stream has an internal lock object which has to be (implicitly) acquired before any work can be done.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Globus_lord

Лол, курсы по java. Читай книги, программируй, нарабатывай 10000 часов. Не занимайся ерундой.

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

ну и чудесно - т.о. можно юзать обычные POSIX fwrite(3), и не ломать голову всякими семафорами.

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

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

Досточно сделать функцию записи в лог защищенную мьютексом или делать flock() файлу перед записью.

т.е все логгирование это

struct Logger
{
  pthread_mutex_t mutex;
  FILE *fd;
};

int open_log(struct Logger *log, char *path)
{
//инициализация
}

int do_looging(struct Logger *log, char *format, ...)
{
  pthread_mutex_lock(&log->mutex);
  vfprintf(log->fd,format, va_list ap);
}


Типа того
OxiD ★★★★
()
Ответ на: комментарий от no-dashi

Демон с UNIX-сокетом, библиотека с функцией логгирования которая коннектится к сокету и отправляет в него сообщение

демон

простейший логгер

overengineered во все поля

slackwarrior ★★★★★
()

Логика проста: пишешь класс (скажем Log), принимающий имя файла в качестве аргумента конструктора и инкапсулирующий мьютекс для мультиплексирования операций записи в лог. В осуществляющем собственно логирование методе класса (скажем, void Log::log(const char * msg);), должна происходить блокировка искомого мьютекса, запись сообщения в файл и разблокировка мьютекса. По сути - все. Читать следующие маны:

man pthreads - дока по потокам и средствам межпоточной синхронизации; http://cplusplus.com/ - там раздел по потокам ввода/вывода (для файловых операций).

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

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

главное не начудить с мютексом в методе, чтобы при исключении он не заблокировал файл

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от no-dashi

под Windows никаких указаний на syslog и линукс вообще, но ты упорото прибиваешь все гвоздями к syslog, детка, еще и гордишься... это в тебе вещества бродят :) кроссплатформенно че там

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

прошлый семестр досдаёшь?

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

под Windows никаких указаний

Стартовый пост прочитай. Кроме того, UNIX domain sockets легко и непринужденно заменяются на UDP/TCP при желании.

no-dashi ★★★★★
()
Ответ на: комментарий от Boy_from_Jungle

Это да! :) В плюсах можно использовать шаблон RAII, когда вводится некий класс MutexLocker, который в конструкторе блокирует мьютекс, а в деструкторе - разблокирует его...

illy
()
Ответ на: комментарий от no-dashi

Сокеты сокетами, а сислог-то и не при чем :) То есть «при желании» (с) можно его поддержать, но... не обязательно, а в «простейшем логгере» и вообще не нужно.

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

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

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

На оффтопике куда ты с этими сокетами? (Или слушать их wiresharkом и в дампы складывать? Или нету syslog - всьо, дропаем платформу? :)) «библиотека с функцией логгирования» - это вообще чит. На платформе ее может не быть, а если ее надо написать - это уже не «меньше в разы проблем с блокировками, привилегиями и прочим». Всего лишь добавочная зависимость, совершенно не нужная в «простейшем логгере», если он хоть немного кроссплатформенный :)

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