Отправьте JNI C stderr/stdout через log4j

Мое приложение Java использует JNI для вызова библиотеки, записанной в C. Эта собственная библиотека регистрирует ошибки к stderr, но я хотел бы перенаправить поток сообщений об ошибках через свой log4j регистратор так или иначе. Действительно ли это возможно?

Библиотека C является внешней - у меня нет источника, так не может изменить его.

Спасибо

6
задан dogbane 30 December 2009 в 22:56
поделиться

2 ответа

В прошлом мне повезло с такими сайтами, как OpenDesigns и FreeCSSTemplates - они предлагают (в основном) лицензионные HTML-шаблоны; вы должны будете сами добавить шаблон Джанго. Однако, как отметил Джеймс, большинство из них поднимут тебя на ноги, но ты почти всегда хочешь сделать шаг дальше.

Мой совет: создайте небольшую библиотеку повторно используемых шаблонов (используя материалы с вышеперечисленных сайтов), получите действительно удобное редактирование HTML и CSS (потому что вы будете редактировать HTML и CSS), затем найти некоторые kickass дизайнеры (желательно локальные) и получить действительно дружественные с ними. Возможно, вы можете торговать одолжениями; вы делаете некоторые работы по кодированию для них, бесплатно, и взамен они делают некоторые дизайнерские работы для вас. Я обнаружил, что даже если вам придется заплатить, хороший дизайнер хорошо стоит денег (серьезно, кто хочет провести свое время тестирования сайтов в IE6?).

Удачи с вашим поиском - я, например, хотел бы увидеть ваши выводы.

-121--3690584-

Контрольную сумму (например, MD5 исходного содержимого) можно добавить в конец файла. После расшифровки последние 16 байт должны быть снова равны md5 (содержимое-16 байт)

-121--317â7-

Примечание: Я не пробовал этот ответ; YMMV.

Метод POSIX freopen изменит базовый файл, связанный с потоком. Как гласит manpage: "Основное использование функции freopen () состоит в изменении файла, связанного со стандартным потоком текста (stderr, stdin или stdout)".

Таким образом, можно создать собственную библиотеку JNI, которая просто перенаправит поток в файл. Однако существует несколько серьезных препятствий для выполнения этой задачи:

  1. Вам необходимо убедиться, что ваш Java программа сама не использует стандарт потоки, потому что они будут перенаправлено тоже. Обходной путь для изменение System.out и др. к чему-то другому при запуске программы.
  2. Возможно, что сторонняя библиотека обходит стандарт текстовые потоки и запись непосредственно в базовый дескриптор файла. Его маловероятно, но возможно. Я не могу помните, только ли freopen () изменяет дескриптор файла, используемый буферизированный поток или фактически повторно открывает базовый fd.
  3. Вы будете все еще есть проблема подключения изменяет "файл" на средство ведения журнала.

Эта последняя точка, безусловно, самая большая: stdio записывает в дескриптор файла уровня ОС. Для чтения этого дескриптора и записи в журнал необходимо создать код Java-уровня. Сначала я подумал, что вам придется использовать именованный канал, а затем раскрутить новый поток Java, чтобы прочитать этот канал. Но это не будет переноситься на другие операционные системы, и вы будете управлять именем канала в конфигурации вашей программы.

Предполагая, что это серверная программа, и сама по себе не обрабатывает стандартные потоки ввода-вывода, я думаю, что лучшим решением будет настройка Log4J с помощью консольного регистратора и простое перенаправление всех выходных данных консоли в файл.

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

3
ответ дан 17 December 2019 в 20:32
поделиться

Мой C немного заржавел, но это возможно, так как вы можете вызывать методы PrinStream изнутри C через JNI. Но вам придется найти способ подключиться, когда поток будет записан на.

Update: Это может помочь вам с подключением stdout изнутри C:

http://www.gnu.org/software/hello/manual/libc/Hook-Functions.html

-1
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

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