Если вы хотите сохранить информацию о номере строки (каждое сообщение указывает на свой вызов .log (), а не все указывает на нашу оболочку), вы должны использовать .bind()
. Вы можете добавить дополнительный аргумент временной метки с помощью console.log.bind(console,
, но проблема в том, что вам нужно повторять это каждый раз, чтобы получить функцию, связанную с новой временной меткой. Неловким способом сделать это является функция, которая возвращает связанную функцию:
function logf() {
// console.log is native function, has no .bind in some browsers.
// TODO: fallback to wrapping if .bind doesn't exist...
return Function.prototype.bind.call(console.log, console, yourTimeFormat());
}
, которая затем должна использоваться с двойным вызовом:
logf()(object, "message...")
НО мы можем сделать первое Вызвать неявно, установив свойство с функцией getter:
var origLog = console.log;
// TODO: fallbacks if no `defineProperty`...
Object.defineProperty(console, "log", {
get: function () {
return Function.prototype.bind.call(origLog, console, yourTimeFormat());
}
});
Теперь вы просто вызываете console.log(...)
и автоматически добавляется метка времени!
> console.log(12)
71.919s 12 VM232:2
undefined
> console.log(12)
72.866s 12 VM233:2
undefined
Вы можете даже достичь этого магического поведения с помощью простого log()
вместо console.log()
, выполнив Object.defineProperty(window, "log", ...)
.
См. https://github.com/pimterry/loglevel для хорошо выполненной безопасной оболочки консоли, использующей .bind()
, с ошибками совместимости.
См. https://github.com/eligrey/Xccessors , чтобы узнать о возможностях восстановления совместимости с defineProperty()
на устаревший __defineGetter__
API. Если ни одно из свойств API не работает, вам следует вернуться к функции-оболочке, которая каждый раз получает новую метку времени. (В этом случае вы потеряете информацию о номере строки, но отметки времени все равно будут отображаться.)
Boilerplate: форматирование времени так, как мне нравится:
var timestampMs = ((window.performance && window.performance.now) ?
function() { return window.performance.now(); } :
function() { return new Date().getTime(); });
function formatDuration(ms) { return (ms / 1000).toFixed(3) + "s"; }
var t0 = timestampMs();
function yourTimeFormat() { return formatDuration(timestampMs() - t0); }
Конечно, можете. Вопрос в том, действительно ли вы хотите:)
Я действительно сталкивался с этой проблемой в дикой природе; как вы заметили, очистка временных файлов с помощью deleteOnExit () бесполезна при запуске службы, а не приложения. Я обнаружил, что наиболее стабильным решением было реструктурировать поток программы таким образом, чтобы временные файлы создавались для каждой задачи и явно удалялись, когда они больше не нужны.
Если вы сделаете это любым другим способом, то есть если программа будет не имея возможности решить, следует ли сохранить или удалить временный файл на каком-либо этапе выполнения, у вас может быть проблема с дизайном. Перенос файлов в какой-нибудь менеджерский жгут просто отложит "настоящее" решение;)
Сборка мусора - неправильное пространство имен для этого типа обработки информации.
Для обработки временных файлов должно быть достаточно следующего пункта.
Вам следует попытаться удалить файл сразу после того, как вы больше не используете его. Блок finalize может справиться с этим.
Вы должны использовать DeleteOnExit.
Вы можете создавать свои временные файлы в специальном временном каталоге. Этот временный каталог можно удалить при запуске и закрытии приложения, чтобы убедиться, что временные файлы не существуют после закрытия приложения.
Вы можете посмотреть PhantomReference :
Phantom ссылочные объекты, которые ставятся в очередь после того, как сборщик определяет, что в противном случае их референты могут быть возвращены. Фантомные ссылки чаще всего используются для планирования предварительных действий по очистке более гибким способом, чем это возможно с помощью механизма финализации Java.
Relying on an event to fire when your class is destroyed is not going to be foolproof, and may leave files behind.
I think the simplest and most reliable way to achieve cleanup of your temp files is as follows:
With this approach you need not fear if your program crashes for some reason and leaves temp files behind, and you also don't need to worry about the program deleting files which are still in use.
Сборщик мусора бесполезен для таких вещей. Он разработан для управления памятью и может иметь много недостатков.
] И то, и другое случается особенно часто, если Java запускается с большой кучей - что на стороне сервера не является необычным.
В какой-то момент в вашей программе вам нужно закрыть потоки в этом файле (в противном случае вы съедает дескрипторы системных файлов, что делает систему непригодной для использования, я это уже сделал). В момент закрытия потоков вы также можете удалить связанный файл. Это самый чистый способ.
Ну, вы могли бы создать оболочку для файла, который использует финализатор для удаления вашего файла, когда объект собирается сборщиком мусора.
Но финализаторы не вызываются любым предсказуемым способом, поэтому я бы вообще не рекомендовал это.
Сборщик мусора - не то место, где можно освобождать ресурсы такого типа. Пожалуйста, ознакомьтесь с этими двумя статьями ниже о том, как освободить ресурсы на Java. http://c2.com/cgi/wiki?ReleasingResourcesInJava А также проблемы с производительностью финализаторов Java. Они могут дать некоторое представление и понимание того, как его следует использовать. http://www.enyo.de/fw/notes/java-gc-finalizers.html