Есть ли способ сделать ссылку / символическую ссылку / ярлык на последний файл в Windows? Следите за последним файлом журнала - PullRequest
0 голосов
/ 05 мая 2018

Я искал все выше и ниже, нашел, как это сделать в * nix, но ничего о Windows.

Первым местом, где я увидел это, был catcatina.out Tomcat, и теперь мне было интересно, как сделать подобное в Windows: рассмотреть папку, в которой создаются файлы журнала, как создать файл, который читает / указывает на последний журнал создан?

Я думаю, что решение Powershell возможно, но, честно говоря, я не могу думать или найти какой-либо способ сделать это.

(edit) Вы, ребята, проголосовавшие, по крайней мере, могли бы оставить комментарий, чтобы сказать мне, что я сделал неправильно или как я могу улучшить этот вопрос?

(правка) Идея здесь в том, чтобы иметь какой-то способ создать символическую ссылку, которая указывает на последний файл журнала в папке, чтобы программа могла отслеживать всегда один и тот же файл, независимо от того, меняет ли последний файл свое имя - как tail -f catalina.out всегда читает последний файл журнала catalina.

Единственный выход, который я вижу и которого я хотел бы избежать, - это написать скрипт powershell, который будет отслеживать папку (https://superuser.com/questions/226828/how-to-monitor-a-folder-and-trigger-a-command-line-action-when-a-file-is-created) и будет динамически создавать символическую ссылку на последний найденный файл (https://stackoverflow.com/a/11211005/1985023), затем установите его в качестве службы, чтобы он всегда работал в фоновом режиме.

1 Ответ

0 голосов
/ 05 мая 2018

Вместо того, чтобы искать динамически самообновляющуюся символическую ссылку (что было бы довольно громоздко для реализации - см. Полезные советы из БЕКОН в комментариях к вопросу), вы можете сделать эту работу как автономная функция / скрипт с помощью PowerShell фоновые задания :

  • Запуск в цикле , который периодически получает последние строки файла журнала из фонового задания, что эквивалентно Unix tail -f через Get-Content -Wait -Tail 10.

  • Если новый файл журнала найден, завершите предыдущее фоновое задание и запустите его для нового файла журнала.

Обратите внимание, что это зависит от периодического опроса фонового задания, связанного с журналом. Приведенный ниже код позволяет настроить интервал опроса.
Обратите внимание, что Get-Content -Wait сам опрашивает целевой файл на предмет изменений каждую секунду.

Вот код; запустите $VerbosePreference = 'Continue', чтобы увидеть, что происходит внутри цикла:

$dir = 'C:\path\to\logs' # the log-file directory
$logFilePattern = '*.log' # wildcard pattern matching log files
$sleepIntervalMs = 1000  # how many msec. to sleep between getting new lines from the background job

Write-Host -ForegroundColor Green "Tailing the latest log(s) in $dir...`nPress any key to quit."
$currJob = $currLog = $null
while ($true) {

  # If the user pressed a key, clean up and exit.
  if ([console]::KeyAvailable) {
    $null = [console]::ReadKey($True) # consume the key - it will still have printed, though
    if ($currJob) { Remove-Job -Job $currJob -Force }
    break
  }

  # Get the latest lines from the current log from the background job.
  if ($currJob) {
    Write-Verbose "Checking for new lines in $newLog..."
    Receive-Job -Job $currJob
    Start-Sleep -Milliseconds $sleepIntervalMs  # sleep a little
  }

  # Determine the first / newest log.
  $newLog = Get-ChildItem -LiteralPath $dir -Filter $logFilePattern | Sort-Object CreationTimeUtc -Descending | Select-Object -First 1
  if ($newLog.FullName -ne $currLog.FullName) { # new log file found.

    Write-Verbose "(New) log file found: $newLog"

    if ($currJob) {
        Write-Verbose "Terminating background job for previous log ($currLog)."
        Remove-Job -Job $currJob -Force
        # When a *new* log was just started, we show *all* lines (and keep listening for more).
        $tailArg = @{} 
    } else {
        # When we first start monitoring, we start with the *last 10* lines
        # of the current log (and keep listening for more).
        $tailArg = @{ Tail = 10 } # On first
    }

    $currLog = $newLog

    Write-Verbose "Starting background job for $currLog..."
    # Start the background job for the new log.
    $currJob = Start-Job { Get-Content -Wait @using:tailArg -LiteralPath $using:newLog.FullName }

  }

}
Write-Host -ForegroundColor Green "Terminated."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...