Page History
Table of Contents |
---|
Info | ||||||||
---|---|---|---|---|---|---|---|---|
The below solution from an individual workflow has been replaced by the built-in feature of JOC Cockpit to make log files for orders and tasks available, see JS7 - Settings
|
Introduction
JS7 does not make use of files for log output of order logs and task logs, see JS7 - Order Logs and Task Logs. JS7 instead Instead, JS7 streams log output from Agents to the Controller and to the JOC Cockpit without use of files.
...
To support a situation when log output should be consolidated to files the , the JS7 - REST Web Service API allows access to log output of orders and jobs. The JS7 - PowerShell Module is a lightweight wrapper for the REST Web Service API that which is used for the examples below examples with Linux and Windows. Users are free to use the JS7 REST Web Service from their preferred scripting language to provide similar functionality.
...
- The
Get-JS7TaskHistory
cmdlet returns history results that which can be filtered by folders, workflows, date range, jobs , - see the cmdlet description. By default today's task executions are returned. - The
Get-JS7TaskLog
cmdlet is used in a pipeline and returns the task log object for each history entry. - As a result the
$logs
array holds will hold the list of task log objects.
...
A task log object carries a number of attributes as visible from shown in the following console example:
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
Get-JS7TaskHistory -RelativeDateFrom -8h | Get-JS7TaskLog | Select-Object @{name='path'; expression={ "/tmp/history/$(Get-Date $_.startTime -f 'yyyyMMdd-hhmmss')-$([io.path]::GetFileNameWithoutExtension($_.job)).task.log"}}, @{name='value'; expression={ $_.log }} | Set-Content |
...
Reads the logs of tasks that have completed within the last 8 hours and writes the log output to individual files in the
/tmp
directory.The log file names are created from the start time and from the job name of each task.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
# execute once
$lastHistory = Get-JS7TaskHistory -RelativeDateFrom -8h | Sort-Object -Property startTime
# execute in intervals
Get-JS7TaskHistory -DateFrom $lastHistory[0].startTime | Tee-Object -Variable lastHistory | Get-JS7TaskLog | Select-Object @{name='path'; expression={ "/tmp/history/$(Get-Date $_.startTime -f 'yyyyMMdd-hhmmss')-$([io.path]::GetFileNameWithoutExtension($_.job)).task.log"}}, @{name='value'; expression={ $_.log }} | Set-Content |
...
Provides a mechanism to subsequently retrieve previous logs. Starting from initial execution of the
Get-JS7TaskHistory
cmdlet, the resulting$lastHistory
object is used for any subsequent calls.
Consider use of theTee-Object
cmdlet in the pipeline that updates the$lastHistory
object that which can be used for later executions of the same pipeline.This pipeline can e.g. be executed in a cyclic job.
...
A workflow is created that runs the above commands in a cycle. The workflow operates 24/7 and writes task logs to files.
Download (.json upload): pdwTaskLogsToFiles.workflow.json
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#!/usr/bin/env pwsh Import-Module JS7 Connect-JS7 -Url http://root:root@localhost:4446 -Id Controller | Out-Null $lastHistory = Get-JS7TaskHistory -RelativeDateFrom -30m | Sort-Object -Property startTime # serializeforward anda base64variable encodefor the object $xmlLastHistory = [management.automation.psserializer]::Serialize( $lastHistory ) $lastHistoryEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( $xmlLastHistory )) # forward a variable for the object "lastHistoryEncoded=$lastHistoryEncoded" "lastHistory=json:$($lastHistory | ConvertTo-Json -Compress)" | Out-File $env:JS7_RETURN_VALUES -Append Disconnect-JS7 |
...
- Line 1: The shebang is required to identify PowerShell being the interpreter of the script. The above example is for Unix, for Windows the first line of the job script should be replaced as follows:
Code Block language powershell title Example of shebang for PowerShell with Unix linenumbers true #!/usr/bin/env pwsh
Code Block language powershell title Example of shebang for PowerShell with Windows linenumbers true @@findstr/v "^@@f.*&" "%~f0"|pwsh.exe -&goto:eof
- Line 4: The are a number of ways how to specify of specifying details for a JS7 connection, see seethe JS7 - How to connect to JOC Cockpit using the PowerShell Module article.
- The host and port are specific for a user's environment.
- The Controller ID is specified during installation of the Controller and defaults to
Controller
.
- Line 9-13:
- A workflow variable is created that which carries the History ID of the latest entry list of task log objects returned by
the Get-JS7TaskHistory
cmdlet for which task logs should be created. This variable is in fact a PowerShell object that is serialized and base64-encoded for to JSON and prefixed with the stringjson:
for later use with the second job in the workflow.
...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
#!/usr/bin/env pwsh Import-Module JS7 Connect-JS7 -Url http://root:root@localhost:4446 -Id Controller | Out-Null # restore bas64object from decodejson andby deserializea thetemporary objectfile $xmlLastHistory$lastHistory = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String(( (Get-Content $env:LAST_HISTORY_ENCODED )) $lastHistory = [System.Management.Automation.PSSerializer]::Deserialize( $xmlLastHistoryFILE).Substring(5) | ConvertFrom-Json ) Get-JS7TaskHistory -DateFrom $lastHistory[0].startTime | Tee-Object -Variable lastHistory | Get-JS7TaskLog | Select-Object @{name='path'; expression={ "/tmp/history/$(Get-Date $_.startTime -f 'yyyyMMdd-hhmmss')-$([io.path]::GetFileNameWithoutExtension($_.job)).task.log"}}, @{name='value'; expression={ $_.log }} | Set-Content # serializeforward anda base64variable encodefor the object $xmlLastHistory = [management.automation.psserializer]::Serialize( $lastHistory ) $lastHistoryEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( $xmlLastHistory )) # forward a variable for the object "lastHistoryEncoded=$lastHistoryEncoded""lastHistory=json:$($lastHistory | ConvertTo-Json -Compress)" | Out-File $env:JS7_RETURN_VALUES -Append Disconnect-JS7 |
...
- Lines 1, 4: Same explanations as for the previous job.
- Lines 7,8: The History ID : The variable holding the list of task log objects of the last processing of this job is picked up restored from a temporary file that holds the JSON representation of the objects. The temporary files is provided by the JS7 Agent and is referenced from an environment variable that is assigned the workflow variable previously serialized and base64-encodedlike this.
Line 10: When reading the task history then the variable carrying the History ID list of task log objects is updated and is forwarded to the workflow for next execution of the cycle.
...