[se-StorePathName] was missing in the footnotes, and links to sets were wrong. Also rename serialization.md to types.md to match the title. Change-Id: I8e602df1958cf5354c6fd3a5c16cbe859a0549b9 Reviewed-on: https://cl.snix.dev/c/snix/+/30275 Autosubmit: Florian Klink <flokli@flokli.de> Tested-by: besadii Reviewed-by: Brian Olsen <brian@maven-group.org>
		
			
				
	
	
		
			135 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						|
title: Logging
 | 
						|
slug: logging
 | 
						|
description: ""
 | 
						|
summary: ""
 | 
						|
date: 2025-03-24T13:10:37+02:00
 | 
						|
lastmod: 2025-03-24T13:10:37+02:00
 | 
						|
draft: false
 | 
						|
weight: 54
 | 
						|
toc: true
 | 
						|
---
 | 
						|
 | 
						|
Because the daemon protocol only has one sender stream and one receiver stream
 | 
						|
logging messages need to be carefully interleaved with requests and responses.
 | 
						|
Usually this means that after the operation and all of its inputs (the request)
 | 
						|
has been read logging hijacks the sender stream (in the server case) and uses
 | 
						|
it to send typed logging messages while the request is being processed. When
 | 
						|
the response has been generated it will send `STDERR_LAST` to mark that what
 | 
						|
follows is the response data to the request. If the request failed a
 | 
						|
`STDERR_ERROR` message is sent with the error and no response is sent.
 | 
						|
 | 
						|
While not in this state between request reading and response sending all
 | 
						|
messages and activities are buffered until next time the logger can send data.
 | 
						|
 | 
						|
The logging messages supported are:
 | 
						|
- [`STDERR_LAST`](#stderr_last)
 | 
						|
- [`STDERR_ERROR`](#stderr_error)
 | 
						|
- [`STDERR_NEXT`](#stderr_next)
 | 
						|
- [`STDERR_READ`](#stderr_read)
 | 
						|
- [`STDERR_WRITE`](#stderr_write)
 | 
						|
- [`STDERR_START_ACTIVITY`](#stderr_start_activity)
 | 
						|
- [`STDERR_STOP_ACTIVITY`](#stderr_stop_activity)
 | 
						|
- [`STDERR_RESULT`](#stderr_result)
 | 
						|
 | 
						|
 | 
						|
### `STDERR_LAST`
 | 
						|
Marks the end of the logs, normal processing can resume.
 | 
						|
 | 
						|
- 0x616c7473 :: [UInt64][se-UInt64] (hardcoded, 'alts' in ASCII)
 | 
						|
 | 
						|
 | 
						|
### `STDERR_ERROR`
 | 
						|
This also marks the end of this log "session" and so it
 | 
						|
has the same effect as `STDERR_LAST`.
 | 
						|
On the client the error is thrown as an exception and no response is read.
 | 
						|
 | 
						|
#### If protocol version is 1.26 or newer
 | 
						|
- 0x63787470 :: [UInt64][se-UInt64] (hardcoded, 'cxtp' in ASCII)
 | 
						|
- error :: [Error][se-Error]
 | 
						|
 | 
						|
#### If protocol version is older than 1.26
 | 
						|
- 0x63787470 :: [UInt64][se-UInt64] (hardcoded, 'cxtp' in ASCII)
 | 
						|
- msg :: [String][se-String] (If logger is JSON, invalid UTF-8 is replaced with U+FFFD)
 | 
						|
- exitStatus :: [Int][se-Int]
 | 
						|
 | 
						|
 | 
						|
### `STDERR_NEXT`
 | 
						|
Normal string log message.
 | 
						|
 | 
						|
- 0x6f6c6d67 :: [UInt64][se-UInt64] (hardcoded, 'olmg' in ASCII)
 | 
						|
- msg :: [String][se-String] (If logger is JSON, invalid UTF-8 is replaced with U+FFFD)
 | 
						|
 | 
						|
 | 
						|
### `STDERR_READ`
 | 
						|
Reader interface used by ImportsPaths and AddToStoreNar (between 1.21 and 1.23).
 | 
						|
It works by sending a *desired* buffer length and then on the receiver stream it
 | 
						|
reads the *actual* buffer length followed by a bytes buffer of that length padded to
 | 
						|
8 bytes. If it receives 0 bytes it sees this as an unexpected EOF.
 | 
						|
 | 
						|
- 0x64617461 :: [UInt64][se-UInt64] (hardcoded, 'data' in ASCII)
 | 
						|
- desiredLen :: [Size][se-Size]
 | 
						|
 | 
						|
 | 
						|
### `STDERR_WRITE`
 | 
						|
Writer interface used by ExportPath. Simply writes a buffer.
 | 
						|
 | 
						|
- 0x64617416 :: [UInt64][se-UInt64] (hardcoded)
 | 
						|
- buffer :: [Bytes][se-Bytes]
 | 
						|
 | 
						|
 | 
						|
### `STDERR_START_ACTIVITY`
 | 
						|
Begins an activity. In other tracing frameworks this would be called a span.
 | 
						|
 | 
						|
Implemented in protocol 1.20. To achieve backwards compatible with older
 | 
						|
versions of the protocol instead of sending an `STDERR_START_ACTIVITY`
 | 
						|
the level is checked against enabled logging level and the text field is
 | 
						|
sent as a simple log message with `STDERR_NEXT`.
 | 
						|
 | 
						|
- 0x53545254 :: [UInt64][se-UInt64] (hardcoded, 'STRT' in ASCII)
 | 
						|
- act :: [UInt64][se-UInt64]
 | 
						|
- level :: [Verbosity][se-Verbosity]
 | 
						|
- type :: [ActivityType][se-ActivityType]
 | 
						|
- text :: [String][se-String] (If logger is JSON, invalid UTF-8 is replaced with U+FFFD)
 | 
						|
- fields :: [List][se-List] of [Field][se-Field]
 | 
						|
- parent :: [UInt64][se-UInt64]
 | 
						|
 | 
						|
 | 
						|
act is atomic (nextId++ + (getPid() << 32))
 | 
						|
 | 
						|
 | 
						|
### `STDERR_STOP_ACTIVITY`
 | 
						|
Stops the given activity. The activity id should not send any more results.
 | 
						|
Just sends `ActivityId`.
 | 
						|
 | 
						|
Implemented in protocol 1.20. When backwards compatible with older versions of
 | 
						|
the protocol and this message would have been sent it is instead ignored.
 | 
						|
 | 
						|
- 0x53544f50 :: [UInt64][se-UInt64] (hardcoded, 'STOP' in ASCII)
 | 
						|
- act :: [UInt64][se-UInt64]
 | 
						|
 | 
						|
 | 
						|
### `STDERR_RESULT`
 | 
						|
Sends results for a given activity.
 | 
						|
 | 
						|
Implemented in protocol 1.20. When backwards compatible with older versions of
 | 
						|
the protocol and this message would have been sent it is instead ignored.
 | 
						|
 | 
						|
- 0x52534c54 :: [UInt64][se-UInt64] (hardcoded, 'RSLT' in ASCII)
 | 
						|
- act :: [UInt64][se-UInt64]
 | 
						|
- type :: [ResultType][se-ResultType]
 | 
						|
- fields :: [List][se-List] of [Field][se-Field]
 | 
						|
 | 
						|
 | 
						|
 | 
						|
[se-UInt64]: {{< relref "types.md" >}}#uint64
 | 
						|
[se-Int]: {{< relref "types.md" >}}#int
 | 
						|
[se-Size]: {{< relref "types.md" >}}#size
 | 
						|
[se-Verbosity]: {{< relref "types.md" >}}#verbosity
 | 
						|
[se-ActivityType]: {{< relref "types.md" >}}#activitytype
 | 
						|
[se-ResultType]: {{< relref "types.md" >}}#resulttype
 | 
						|
[se-Bytes]: {{< relref "types.md" >}}#bytes
 | 
						|
[se-String]: {{< relref "types.md" >}}#string
 | 
						|
[se-List]: {{< relref "types.md" >}}#list-of-x
 | 
						|
[se-Error]: {{< relref "types.md" >}}#error
 | 
						|
[se-Field]: {{< relref "types.md" >}}#field
 |