簡體   English   中英

在日志中(每行)寫入時間戳,並使用批處理文件觸發jar

[英]Write timestamp in logs (every line) and trigger a jar using a batch file

我有一個jar文件,可以使用該批處理文件觸發該文件,並希望將命令行窗口中顯示的所有內容與時間戳一起記錄下來。 我需要在日志中寫入的每一行中寫入時間戳。 像這樣:

 Tue 06/28/2016,15:42:22.24 - logssssss Tue 06/28/2016,15:42:22.24 - logssssss Tue 06/28/2016,15:42:22.24 - logssssss ... 

我有以下代碼:

@echo off
echo %date%,%time% - %~1 >>output.log
call :sub >>output.txt
echo %date%,%time% - %~1 >>output.log
exit /b

:sub
command1
command2
...
commandN

使用此功能,我只能記錄腳本的開始和結束時間。

編輯1:我希望腳本在屏幕上顯示執行以及寫入文件。

編輯2:現在,我有以下代碼,但它不隨執行一起寫入日志。 請告訴我要改進的地方。

@echo off
setlocal enabledelayedexpansion

SET LogFile=D:\Logs\logfile.out
SET Logg=^> tmp.out^&^& type tmp.out^&^&type tmp.out^>^>%LogFile%

if /I "%~1"=="Recursive" java Test
prompt $D,$T$S-$S
>> %Logg% echo !date!,!time! - %~1
>> %Logg% (for /F delims^=^ eol^= %%$ in ('^(for /F delims^^^=^^^ eol^^^= %%# in ^('"%~f0" Recursive'^) do rem/ %%#^)') do echo %%$)

>> %Logg% echo !date!,!time! - %~1
prompt
exit /b

最簡便的方法是使用日志框架,例如logback,log4j等。但是您需要重構代碼。

在我提供一些建議之前,我想提一下,您應該將重定向放在命令的前面而不是后面,以避免出現空格或其他麻煩,並在所有路徑周圍加上引號,以避免出現白色麻煩。空格或特殊字符,例如:

>>"output.log" echo %date%,%time% - %~1

但是現在解決方案...

您可以利用命令回顯和保存日期/時間信息的自定義提示:

@echo off
>> "output.log" echo %date%,%time% - %~1
>> "output.log" call :sub
>> "output.log" echo %date%,%time% - %~1
exit /b

:sub
prompt $D,$T$S-$S
echo on
command1
command2
...
commandN
@echo off
prompt

這樣您將獲得以下日志條目:

 28-Jun-2016,16:33:31.16 - 28-Jun-2016,16:33:31.16 - command1 logssssss <output of command1> 28-Jun-2016,16:33:31.82 - command2 logssssss <output of command2> 28-Jun-2016,16:33:32.28 - ... logssssss <output of ...> 28-Jun-2016,16:33:36.07 - commandN logssssss <output of commandN> 28-Jun-2016,16:33:36.07 - 

所有空行都是由命令回顯引起的。
請注意,日期/時間信息取決於當前的語言環境設置。

要擺脫命令回顯並僅接收帶有日期/時間前面的命令輸出,可以使用for /F循環捕獲命令輸出,並在rem命令中強制使用日期/時間提示前綴。 但是您不能像call :sub then那樣call :sub子例程,因為for /F中的命令是在另一個不在批處理文件上下文中運行的cmd實例中執行的。 同樣,該cmd實例中的任何環境更改都不會反映在運行該批處理文件的實例中。此外,完成后,您將收到整個:sub節的日志字符串一次,而不是在每個命令之后均收到該字符串。
如果這對您來說都沒有問題,則可能需要使用以下代碼:

@echo off
if /I "%~1"=="Recursive" goto :sub
prompt $D,$T$S-$S
>> "output.log" echo %date%,%time% - %~1
>> "output.log" (echo on & for /F delims^=^ eol^= %%# in ('"%~f0" Recursive') do rem/ %%#)
@echo off
>> "output.log" echo %date%,%time% - %~1
prompt
exit /b

:sub
command1
command2
...
commandN

call :sub命令將替換為有條件的goto :sub命令。 for /F調用批處理文件時,將傳遞Recursive參數; 如果識別出此字符串,則在:sub部分繼續執行。

日志條目將如下所示:

 28-Jun-2016,16:33:31.16 - 28-Jun-2016,16:33:31.16 - rem/ logssssss <output of command1> 28-Jun-2016,16:33:31.82 - rem/ logssssss <output of command2> 28-Jun-2016,16:33:32.28 - rem/ logssssss <output of ...> 28-Jun-2016,16:33:36.07 - rem/ logssssss <output of commandN> 28-Jun-2016,16:33:36.07 - 

要擺脫空行,請替換命令行...:

>> "output.log" (echo on & for /F delims^=^ eol^= %%# in ('"%~f0" Recursive') do rem/ %%#)

...由這個...

>> "output.log" (for /F delims^=^ eol^= %%$ in ('^(for /F delims^^^=^^^ eol^^^= %%# in ^('"%~f0" Recursive'^) do rem/ %%#^)') do echo %%$)

...然后在此之后立即刪除第二行@echo off

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM