Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: worker friendly logger instances #5490

Merged
merged 19 commits into from
May 15, 2023
Merged

Conversation

dapplion
Copy link
Contributor

Motivation

Our current Logger instances are not DX friendly to support workers.

Let's list the requirements:

  1. Downstream dependencies like @lodestar/light-client or @lodestar/reqresp just want access to a generic simple Logger instance to write data at some LogLevel. No need to expose them to more complicated loggers or to force dependencies on NodeJS specific code
  2. Complex intermediate depencies like @lodestar/beacon-node need access to a generic logger with more features, specifically:
    2.1. Create child logger with custom settings, which must re-use references to the same transport instances
    2.2. Serialize a logger instance settings and transport settings for a worker downstream
  3. A worker must be able to instantiate a logger with the same settings as its main thread handler, with new transport instances but that have the same I/O target (stdout, file)
  4. Top level dependency @lodestar/cli has to be able to produce compatible logger instances for the above cases
  5. plus misc use cases for testing (empty logger, test logger)

Description

So to fulfill 1. and 2. there must exist separate insterfaces, which are:

  • Logger
  • LoggerNode

LoggerNode can export its settings with toOpts() and be recreate with those

@dapplion dapplion requested a review from a team as a code owner May 13, 2023 04:03
@github-actions
Copy link
Contributor

github-actions bot commented May 13, 2023

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: dea75d6 Previous: 375d660 Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 842.05 us/op 752.81 us/op 1.12
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 51.725 us/op 60.505 us/op 0.85
BLS verify - blst-native 1.2341 ms/op 1.5040 ms/op 0.82
BLS verifyMultipleSignatures 3 - blst-native 2.5235 ms/op 3.1998 ms/op 0.79
BLS verifyMultipleSignatures 8 - blst-native 5.5078 ms/op 6.7037 ms/op 0.82
BLS verifyMultipleSignatures 32 - blst-native 19.820 ms/op 23.022 ms/op 0.86
BLS aggregatePubkeys 32 - blst-native 26.673 us/op 33.855 us/op 0.79
BLS aggregatePubkeys 128 - blst-native 104.87 us/op 139.90 us/op 0.75
getAttestationsForBlock 59.074 ms/op 73.019 ms/op 0.81
isKnown best case - 1 super set check 269.00 ns/op 325.00 ns/op 0.83
isKnown normal case - 2 super set checks 254.00 ns/op 319.00 ns/op 0.80
isKnown worse case - 16 super set checks 259.00 ns/op 323.00 ns/op 0.80
CheckpointStateCache - add get delete 6.1030 us/op 6.7300 us/op 0.91
validate gossip signedAggregateAndProof - struct 2.8738 ms/op 3.6397 ms/op 0.79
validate gossip attestation - struct 1.3610 ms/op 1.7337 ms/op 0.79
pickEth1Vote - no votes 1.3721 ms/op 1.7695 ms/op 0.78
pickEth1Vote - max votes 13.449 ms/op 16.093 ms/op 0.84
pickEth1Vote - Eth1Data hashTreeRoot value x2048 10.313 ms/op 13.222 ms/op 0.78
pickEth1Vote - Eth1Data hashTreeRoot tree x2048 17.814 ms/op 23.535 ms/op 0.76
pickEth1Vote - Eth1Data fastSerialize value x2048 779.00 us/op 1.1204 ms/op 0.70
pickEth1Vote - Eth1Data fastSerialize tree x2048 8.9694 ms/op 12.452 ms/op 0.72
bytes32 toHexString 785.00 ns/op 1.1140 us/op 0.70
bytes32 Buffer.toString(hex) 461.00 ns/op 646.00 ns/op 0.71
bytes32 Buffer.toString(hex) from Uint8Array 642.00 ns/op 948.00 ns/op 0.68
bytes32 Buffer.toString(hex) + 0x 436.00 ns/op 604.00 ns/op 0.72
Object access 1 prop 0.20500 ns/op 0.31600 ns/op 0.65
Map access 1 prop 0.16800 ns/op 0.25500 ns/op 0.66
Object get x1000 7.3370 ns/op 9.0110 ns/op 0.81
Map get x1000 0.64900 ns/op 0.82400 ns/op 0.79
Object set x1000 71.536 ns/op 93.274 ns/op 0.77
Map set x1000 57.028 ns/op 79.895 ns/op 0.71
Return object 10000 times 0.25830 ns/op 0.35970 ns/op 0.72
Throw Error 10000 times 4.2909 us/op 7.3116 us/op 0.59
fastMsgIdFn sha256 / 200 bytes 3.5590 us/op 5.9260 us/op 0.60
fastMsgIdFn h32 xxhash / 200 bytes 317.00 ns/op 592.00 ns/op 0.54
fastMsgIdFn h64 xxhash / 200 bytes 471.00 ns/op 810.00 ns/op 0.58
fastMsgIdFn sha256 / 1000 bytes 11.734 us/op 18.302 us/op 0.64
fastMsgIdFn h32 xxhash / 1000 bytes 450.00 ns/op 796.00 ns/op 0.57
fastMsgIdFn h64 xxhash / 1000 bytes 568.00 ns/op 901.00 ns/op 0.63
fastMsgIdFn sha256 / 10000 bytes 104.34 us/op 197.24 us/op 0.53
fastMsgIdFn h32 xxhash / 10000 bytes 1.9860 us/op 3.2980 us/op 0.60
fastMsgIdFn h64 xxhash / 10000 bytes 1.4560 us/op 2.1170 us/op 0.69
enrSubnets - fastDeserialize 64 bits 1.5130 us/op 2.2780 us/op 0.66
enrSubnets - ssz BitVector 64 bits 547.00 ns/op 977.00 ns/op 0.56
enrSubnets - fastDeserialize 4 bits 202.00 ns/op 339.00 ns/op 0.60
enrSubnets - ssz BitVector 4 bits 621.00 ns/op 882.00 ns/op 0.70
prioritizePeers score -10:0 att 32-0.1 sync 2-0 130.25 us/op 158.12 us/op 0.82
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 170.54 us/op 221.86 us/op 0.77
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 195.12 us/op 281.96 us/op 0.69
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 364.45 us/op 453.68 us/op 0.80
prioritizePeers score 0:0 att 64-1 sync 4-1 435.32 us/op 611.17 us/op 0.71
array of 16000 items push then shift 1.6809 us/op 2.2235 us/op 0.76
LinkedList of 16000 items push then shift 9.1210 ns/op 14.840 ns/op 0.61
array of 16000 items push then pop 114.06 ns/op 163.16 ns/op 0.70
LinkedList of 16000 items push then pop 8.7450 ns/op 13.328 ns/op 0.66
array of 24000 items push then shift 2.3895 us/op 3.5349 us/op 0.68
LinkedList of 24000 items push then shift 9.2350 ns/op 14.996 ns/op 0.62
array of 24000 items push then pop 88.179 ns/op 137.18 ns/op 0.64
LinkedList of 24000 items push then pop 8.7000 ns/op 15.093 ns/op 0.58
intersect bitArray bitLen 8 13.415 ns/op 26.373 ns/op 0.51
intersect array and set length 8 82.283 ns/op 163.81 ns/op 0.50
intersect bitArray bitLen 128 44.442 ns/op 83.397 ns/op 0.53
intersect array and set length 128 1.2308 us/op 2.2549 us/op 0.55
Buffer.concat 32 items 3.1320 us/op 8.7940 us/op 0.36
Uint8Array.set 32 items 2.5990 us/op 5.5360 us/op 0.47
pass gossip attestations to forkchoice per slot 2.9411 ms/op 7.0707 ms/op 0.42
computeDeltas 3.1875 ms/op 4.5268 ms/op 0.70
computeProposerBoostScoreFromBalances 1.7924 ms/op 2.4601 ms/op 0.73
altair processAttestation - 250000 vs - 7PWei normalcase 2.5087 ms/op 4.4702 ms/op 0.56
altair processAttestation - 250000 vs - 7PWei worstcase 4.3944 ms/op 6.0162 ms/op 0.73
altair processAttestation - setStatus - 1/6 committees join 139.59 us/op 186.26 us/op 0.75
altair processAttestation - setStatus - 1/3 committees join 279.70 us/op 405.26 us/op 0.69
altair processAttestation - setStatus - 1/2 committees join 373.50 us/op 531.52 us/op 0.70
altair processAttestation - setStatus - 2/3 committees join 468.21 us/op 731.32 us/op 0.64
altair processAttestation - setStatus - 4/5 committees join 647.17 us/op 1.1391 ms/op 0.57
altair processAttestation - setStatus - 100% committees join 771.34 us/op 1.1466 ms/op 0.67
altair processBlock - 250000 vs - 7PWei normalcase 18.183 ms/op 23.531 ms/op 0.77
altair processBlock - 250000 vs - 7PWei normalcase hashState 28.722 ms/op 34.223 ms/op 0.84
altair processBlock - 250000 vs - 7PWei worstcase 48.414 ms/op 75.717 ms/op 0.64
altair processBlock - 250000 vs - 7PWei worstcase hashState 70.301 ms/op 117.58 ms/op 0.60
phase0 processBlock - 250000 vs - 7PWei normalcase 2.4730 ms/op 4.6955 ms/op 0.53
phase0 processBlock - 250000 vs - 7PWei worstcase 30.817 ms/op 64.170 ms/op 0.48
altair processEth1Data - 250000 vs - 7PWei normalcase 602.30 us/op 1.1716 ms/op 0.51
vc - 250000 eb 1 eth1 1 we 0 wn 0 - smpl 15 8.6590 us/op 17.187 us/op 0.50
vc - 250000 eb 0.95 eth1 0.1 we 0.05 wn 0 - smpl 219 28.474 us/op 46.738 us/op 0.61
vc - 250000 eb 0.95 eth1 0.3 we 0.05 wn 0 - smpl 42 10.696 us/op 26.357 us/op 0.41
vc - 250000 eb 0.95 eth1 0.7 we 0.05 wn 0 - smpl 18 8.1470 us/op 18.549 us/op 0.44
vc - 250000 eb 0.1 eth1 0.1 we 0 wn 0 - smpl 1020 106.88 us/op 155.89 us/op 0.69
vc - 250000 eb 0.03 eth1 0.03 we 0 wn 0 - smpl 11777 648.07 us/op 1.2712 ms/op 0.51
vc - 250000 eb 0.01 eth1 0.01 we 0 wn 0 - smpl 16384 961.13 us/op 1.6664 ms/op 0.58
vc - 250000 eb 0 eth1 0 we 0 wn 0 - smpl 16384 908.87 us/op 1.6199 ms/op 0.56
vc - 250000 eb 0 eth1 0 we 0 wn 0 nocache - smpl 16384 2.3055 ms/op 5.5304 ms/op 0.42
vc - 250000 eb 0 eth1 1 we 0 wn 0 - smpl 16384 1.5567 ms/op 3.9118 ms/op 0.40
vc - 250000 eb 0 eth1 1 we 0 wn 0 nocache - smpl 16384 4.3317 ms/op 10.075 ms/op 0.43
Tree 40 250000 create 400.14 ms/op 778.28 ms/op 0.51
Tree 40 250000 get(125000) 195.66 ns/op 408.95 ns/op 0.48
Tree 40 250000 set(125000) 1.1323 us/op 2.8884 us/op 0.39
Tree 40 250000 toArray() 23.537 ms/op 34.735 ms/op 0.68
Tree 40 250000 iterate all - toArray() + loop 22.890 ms/op 39.184 ms/op 0.58
Tree 40 250000 iterate all - get(i) 79.026 ms/op 151.51 ms/op 0.52
MutableVector 250000 create 11.862 ms/op 24.511 ms/op 0.48
MutableVector 250000 get(125000) 6.5060 ns/op 15.719 ns/op 0.41
MutableVector 250000 set(125000) 350.85 ns/op 565.71 ns/op 0.62
MutableVector 250000 toArray() 4.1741 ms/op 5.8773 ms/op 0.71
MutableVector 250000 iterate all - toArray() + loop 4.2276 ms/op 6.6243 ms/op 0.64
MutableVector 250000 iterate all - get(i) 1.6000 ms/op 3.6345 ms/op 0.44
Array 250000 create 3.9233 ms/op 6.0320 ms/op 0.65
Array 250000 clone - spread 1.2641 ms/op 1.9081 ms/op 0.66
Array 250000 get(125000) 0.59400 ns/op 1.3690 ns/op 0.43
Array 250000 set(125000) 0.71000 ns/op 1.6990 ns/op 0.42
Array 250000 iterate all - loop 84.882 us/op 187.49 us/op 0.45
effectiveBalanceIncrements clone Uint8Array 300000 33.646 us/op 61.113 us/op 0.55
effectiveBalanceIncrements clone MutableVector 300000 339.00 ns/op 863.00 ns/op 0.39
effectiveBalanceIncrements rw all Uint8Array 300000 172.52 us/op 473.81 us/op 0.36
effectiveBalanceIncrements rw all MutableVector 300000 82.556 ms/op 209.34 ms/op 0.39
phase0 afterProcessEpoch - 250000 vs - 7PWei 116.36 ms/op 244.27 ms/op 0.48
phase0 beforeProcessEpoch - 250000 vs - 7PWei 48.322 ms/op 70.196 ms/op 0.69
altair processEpoch - mainnet_e81889 332.98 ms/op 517.11 ms/op 0.64
mainnet_e81889 - altair beforeProcessEpoch 77.219 ms/op 101.18 ms/op 0.76
mainnet_e81889 - altair processJustificationAndFinalization 18.350 us/op 19.481 us/op 0.94
mainnet_e81889 - altair processInactivityUpdates 6.3398 ms/op 6.4742 ms/op 0.98
mainnet_e81889 - altair processRewardsAndPenalties 73.214 ms/op 60.342 ms/op 1.21
mainnet_e81889 - altair processRegistryUpdates 3.1930 us/op 2.8900 us/op 1.10
mainnet_e81889 - altair processSlashings 647.00 ns/op 608.00 ns/op 1.06
mainnet_e81889 - altair processEth1DataReset 721.00 ns/op 880.00 ns/op 0.82
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.3497 ms/op 1.4987 ms/op 0.90
mainnet_e81889 - altair processSlashingsReset 5.8140 us/op 5.2330 us/op 1.11
mainnet_e81889 - altair processRandaoMixesReset 6.9540 us/op 8.7850 us/op 0.79
mainnet_e81889 - altair processHistoricalRootsUpdate 857.00 ns/op 1.2360 us/op 0.69
mainnet_e81889 - altair processParticipationFlagUpdates 3.3330 us/op 2.8730 us/op 1.16
mainnet_e81889 - altair processSyncCommitteeUpdates 498.00 ns/op 730.00 ns/op 0.68
mainnet_e81889 - altair afterProcessEpoch 127.91 ms/op 164.97 ms/op 0.78
phase0 processEpoch - mainnet_e58758 367.09 ms/op 523.54 ms/op 0.70
mainnet_e58758 - phase0 beforeProcessEpoch 127.77 ms/op 184.08 ms/op 0.69
mainnet_e58758 - phase0 processJustificationAndFinalization 16.936 us/op 23.094 us/op 0.73
mainnet_e58758 - phase0 processRewardsAndPenalties 63.208 ms/op 85.300 ms/op 0.74
mainnet_e58758 - phase0 processRegistryUpdates 8.6340 us/op 13.897 us/op 0.62
mainnet_e58758 - phase0 processSlashings 797.00 ns/op 1.0450 us/op 0.76
mainnet_e58758 - phase0 processEth1DataReset 519.00 ns/op 623.00 ns/op 0.83
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 1.0213 ms/op 1.2777 ms/op 0.80
mainnet_e58758 - phase0 processSlashingsReset 3.3330 us/op 4.8240 us/op 0.69
mainnet_e58758 - phase0 processRandaoMixesReset 6.7780 us/op 7.4650 us/op 0.91
mainnet_e58758 - phase0 processHistoricalRootsUpdate 928.00 ns/op 1.1230 us/op 0.83
mainnet_e58758 - phase0 processParticipationRecordUpdates 4.5090 us/op 4.6270 us/op 0.97
mainnet_e58758 - phase0 afterProcessEpoch 101.32 ms/op 132.22 ms/op 0.77
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.2691 ms/op 1.4953 ms/op 0.85
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 1.5985 ms/op 1.9508 ms/op 0.82
altair processInactivityUpdates - 250000 normalcase 23.237 ms/op 23.393 ms/op 0.99
altair processInactivityUpdates - 250000 worstcase 26.884 ms/op 31.626 ms/op 0.85
phase0 processRegistryUpdates - 250000 normalcase 8.3250 us/op 8.0960 us/op 1.03
phase0 processRegistryUpdates - 250000 badcase_full_deposits 270.33 us/op 284.06 us/op 0.95
phase0 processRegistryUpdates - 250000 worstcase 0.5 117.17 ms/op 167.53 ms/op 0.70
altair processRewardsAndPenalties - 250000 normalcase 70.752 ms/op 78.735 ms/op 0.90
altair processRewardsAndPenalties - 250000 worstcase 73.975 ms/op 81.399 ms/op 0.91
phase0 getAttestationDeltas - 250000 normalcase 9.1584 ms/op 9.0219 ms/op 1.02
phase0 getAttestationDeltas - 250000 worstcase 8.5572 ms/op 8.7328 ms/op 0.98
phase0 processSlashings - 250000 worstcase 3.9362 ms/op 4.3722 ms/op 0.90
altair processSyncCommitteeUpdates - 250000 188.65 ms/op 228.31 ms/op 0.83
BeaconState.hashTreeRoot - No change 296.00 ns/op 437.00 ns/op 0.68
BeaconState.hashTreeRoot - 1 full validator 58.703 us/op 66.213 us/op 0.89
BeaconState.hashTreeRoot - 32 full validator 637.20 us/op 654.21 us/op 0.97
BeaconState.hashTreeRoot - 512 full validator 6.0631 ms/op 7.7053 ms/op 0.79
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 68.494 us/op 76.942 us/op 0.89
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 964.34 us/op 1.1298 ms/op 0.85
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 14.660 ms/op 15.021 ms/op 0.98
BeaconState.hashTreeRoot - 1 balances 56.678 us/op 65.406 us/op 0.87
BeaconState.hashTreeRoot - 32 balances 532.49 us/op 631.45 us/op 0.84
BeaconState.hashTreeRoot - 512 balances 6.1410 ms/op 5.5009 ms/op 1.12
BeaconState.hashTreeRoot - 250000 balances 77.330 ms/op 94.457 ms/op 0.82
aggregationBits - 2048 els - zipIndexesInBitList 31.533 us/op 20.521 us/op 1.54
regular array get 100000 times 45.832 us/op 53.642 us/op 0.85
wrappedArray get 100000 times 34.236 us/op 41.048 us/op 0.83
arrayWithProxy get 100000 times 20.451 ms/op 19.278 ms/op 1.06
ssz.Root.equals 695.00 ns/op 665.00 ns/op 1.05
byteArrayEquals 782.00 ns/op 656.00 ns/op 1.19
shuffle list - 16384 els 7.9118 ms/op 8.5828 ms/op 0.92
shuffle list - 250000 els 112.03 ms/op 122.99 ms/op 0.91
processSlot - 1 slots 12.753 us/op 10.142 us/op 1.26
processSlot - 32 slots 1.8860 ms/op 1.5981 ms/op 1.18
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 43.101 ms/op 40.253 ms/op 1.07
getCommitteeAssignments - req 1 vs - 250000 vc 2.9693 ms/op 3.2567 ms/op 0.91
getCommitteeAssignments - req 100 vs - 250000 vc 4.2634 ms/op 4.5735 ms/op 0.93
getCommitteeAssignments - req 1000 vs - 250000 vc 4.6594 ms/op 5.0065 ms/op 0.93
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 5.1600 ns/op 4.9600 ns/op 1.04
state getBlockRootAtSlot - 250000 vs - 7PWei 1.2595 us/op 858.98 ns/op 1.47
computeProposers - vc 250000 11.869 ms/op 11.542 ms/op 1.03
computeEpochShuffling - vc 250000 109.99 ms/op 108.21 ms/op 1.02
getNextSyncCommittee - vc 250000 190.60 ms/op 188.58 ms/op 1.01
computeSigningRoot for AttestationData 15.254 us/op 14.593 us/op 1.05
hash AttestationData serialized data then Buffer.toString(base64) 2.6974 us/op 2.5411 us/op 1.06
toHexString serialized data 1.2536 us/op 1.1612 us/op 1.08
Buffer.toString(base64) 381.67 ns/op 330.24 ns/op 1.16

by benchmarkbot/action

@dapplion dapplion changed the title Worker friendly logger instances feat!: worker friendly logger instances May 14, 2023
Comment on lines 16 to 29
"exports": {
".": {
"import": "./lib/index.js"
},
"./browser": {
"import": "./lib/loggers/browser.js"
},
"./node": {
"import": "./lib/loggers/node.js"
},
"./empty": {
"import": "./lib/loggers/empty.js"
}
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of subpath exports why not not use conditional exports https://nodejs.org/api/packages.html#conditional-exports. And only default export. This way user can use a consistent import pattern.

"exports": {
    ".": {
      "node": "./lib/loggers/node.js",
      "browser": "./lib/loggers/browser.js",
      "default": "./lib/index.js"
    },
  },

@wemeetagain wemeetagain merged commit c2e96c8 into unstable May 15, 2023
@wemeetagain wemeetagain deleted the dapplion/worker-logger branch May 15, 2023 23:45
// Return a new logger instance with different module and log level
// but a reference to the same transports, such that there's only one
// transport instance per tree of child loggers
child(opts: LoggerNodeChildOpts): LoggerNode {
Copy link
Member

@nflaig nflaig May 29, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dapplion This changed how we create child loggers, it creates a new event listener for each child logger

Was the previous implementation not compatible when using workers?

child(options: LoggerChildOpts): WinstonLogger {

Using native winston.child does not work as mention in previous comment.

Workaround for now is to just increase max listeners which should be fine to do as explained in the PR

Copy link
Contributor Author

@dapplion dapplion Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm unsure of the reason forgot to document, so may be an oversight. Could you test if the previous approach works fine still?

Copy link
Member

@nflaig nflaig Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Child loggers are only created in the main thread, does not affect workers at all because we initialize a completely new logger instance there

const logger = getNodeLogger(workerData.loggerOpts);

Opened a PR to revert logger.child implementation back to original approach

const filename = opts.file.filepath;

transports.push(
opts.file.dailyRotate != null
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the expected approach to disable log file rotation now?

The comment above does not longer match behavior as setting --logFileDailyRotate 0 will still initialize DailyRotateFile. Default winston.transports.File is effectively never used now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, logFileDailyRotate is a bit a weird UX flag. Does yargs support accepting both syntax with no arg --logFileDailyRotate and with arg --logFileDailyRotate 5? That would make handling easier

Copy link
Member

@nflaig nflaig Jun 1, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both works, but setting --logFileDailyRotate (without value) and omitting the flag will result in 5 due to the fact that we set it as default here

Setting it to 0 to disable daily file rotation seems logical to me (and is most explicit), that's also how it worked previously

@wemeetagain
Copy link
Member

🎉 This PR is included in v1.9.0 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants