Короче говоря, загрузите свою библиотеку с помощью LD_PRELOAD
override syslog (3)вместо подключения (3 ).
Сокет /dev/log
Unix используется функцией syslog (3 )glibc, которая подключается к нему и записывает в него данные. Переопределение connect (3 ), вероятно, не работает, потому что реализация syslog (3 )внутри glibc будет выполнять системный вызов connect (2), а не библиотечную функцию, поэтому ловушка LD_PRELOAD
не будет перехватывать вызов из системного журнала (3 ).
Существует разрыв между strace
, который показывает системные вызовы, и LD_PRELOAD
, который может переопределять библиотечные функции (, в данном случае функции из glibc. )Тот факт, что существует функция connect (3)glibc, а также системный вызов connect (2 ), также помогает устранить эту путаницу. (Возможно, здесь помогло бы использование ltrace
, показывая вместо этого вызовы системного журнала (3 ).)
Вероятно, вы можете подтвердить, что переопределение подключения (3 )в LD_PRELOAD
, которое вы делаете, не будет работать с syslog (3 ), если ваша тестовая программа вызовет syslog (3 )напрямую, а не явно подключаясь к /dev/log
, что, как я подозреваю, является тем, как ведет себя приложение.NET Core.
Подключение к системному журналу (3 )также потенциально более полезно, потому что, находясь на более высоком уровне стека, вы можете использовать этот хук для принятия решений, таких как выборочная пересылка некоторых из сообщения в системный журнал. (Вы можете загрузить функцию системного журнала из glibc с помощью dlsym(RTLD_NEXT, "syslog")
,а затем вы можете использовать этот указатель функции для вызова syslog (3 )для сообщений, которые вы хотите переслать с вашего хука.)
Подход с заменой /dev/log
на символическую ссылку на /dev/null
несовершенен, поскольку /dev/null
не принимает операции соединения (2 )(только файловые операции, такие как открытие (2 )), поэтому syslog (3 )попытается подключиться и получить ошибку и как-то попытаться ее обработать (или, возможно, вернуть вызывающей стороне ), в любом случае это может иметь побочные эффекты.
Надеемся, что здесь достаточно LD_PRELOAD
переопределения системного журнала (3 ).