Мое приложение Java использует JNI для вызова библиотеки, записанной в C. Эта собственная библиотека регистрирует ошибки к stderr, но я хотел бы перенаправить поток сообщений об ошибках через свой log4j регистратор так или иначе. Действительно ли это возможно?
Библиотека C является внешней - у меня нет источника, так не может изменить его.
Спасибо
В прошлом мне повезло с такими сайтами, как 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, которая просто перенаправит поток в файл. Однако существует несколько серьезных препятствий для выполнения этой задачи:
System.out
и др.
к чему-то другому при запуске программы. Эта последняя точка, безусловно, самая большая: stdio записывает в дескриптор файла уровня ОС. Для чтения этого дескриптора и записи в журнал необходимо создать код Java-уровня. Сначала я подумал, что вам придется использовать именованный канал, а затем раскрутить новый поток Java, чтобы прочитать этот канал. Но это не будет переноситься на другие операционные системы, и вы будете управлять именем канала в конфигурации вашей программы.
Предполагая, что это серверная программа, и сама по себе не обрабатывает стандартные потоки ввода-вывода, я думаю, что лучшим решением будет настройка Log4J с помощью консольного регистратора и простое перенаправление всех выходных данных консоли в файл.
Или поговорите с теми, кто написал библиотеку, чтобы заставить их добавить настраиваемое ведение журнала.
Мой C немного заржавел, но это возможно, так как вы можете вызывать методы PrinStream изнутри C через JNI. Но вам придется найти способ подключиться, когда поток будет записан на.
Update: Это может помочь вам с подключением stdout изнутри C:
http://www.gnu.org/software/hello/manual/libc/Hook-Functions.html