Skip to content

Commit c7b3882

Browse files
authored
Log raw events to a separate log file (#4549)
This commit introduces a new logger core, used when collecting logs from sub process, that can be configured through `agent.logging.event_data` and is used to log any message that contains the whole event or could contain any sensitive data. This is accomplished by adding `log.type: event` to the log entry. The logger core is responsible for filtering the log entries and directing them to the correct files.
1 parent 87a8930 commit c7b3882

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+889
-118
lines changed

NOTICE.txt

+94-2
Original file line numberDiff line numberDiff line change
@@ -2643,6 +2643,29 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-ucfg@v0.8.8/
26432643
limitations under the License.
26442644

26452645

2646+
--------------------------------------------------------------------------------
2647+
Dependency : github.com/elastic/mock-es
2648+
Version: v0.0.0-20240605193845-b5546a703d6f
2649+
Licence type (autodetected): Apache-2.0
2650+
--------------------------------------------------------------------------------
2651+
2652+
Contents of probable licence file $GOMODCACHE/github.com/elastic/mock-es@v0.0.0-20240605193845-b5546a703d6f/LICENSE:
2653+
2654+
Copyright 2024 Elasticsearch B.V.
2655+
2656+
Licensed under the Apache License, Version 2.0 (the "License");
2657+
you may not use this file except in compliance with the License.
2658+
You may obtain a copy of the License at
2659+
2660+
http://www.apache.org/licenses/LICENSE-2.0
2661+
2662+
Unless required by applicable law or agreed to in writing, software
2663+
distributed under the License is distributed on an "AS IS" BASIS,
2664+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2665+
See the License for the specific language governing permissions and
2666+
limitations under the License.
2667+
2668+
26462669
--------------------------------------------------------------------------------
26472670
Dependency : github.com/fatih/color
26482671
Version: v1.15.0
@@ -6214,6 +6237,45 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
62146237
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
62156238

62166239

6240+
--------------------------------------------------------------------------------
6241+
Dependency : github.com/rcrowley/go-metrics
6242+
Version: v0.0.0-20201227073835-cf1acfcdf475
6243+
Licence type (autodetected): BSD-2-Clause-FreeBSD
6244+
--------------------------------------------------------------------------------
6245+
6246+
Contents of probable licence file $GOMODCACHE/github.com/rcrowley/go-metrics@v0.0.0-20201227073835-cf1acfcdf475/LICENSE:
6247+
6248+
Copyright 2012 Richard Crowley. All rights reserved.
6249+
6250+
Redistribution and use in source and binary forms, with or without
6251+
modification, are permitted provided that the following conditions are
6252+
met:
6253+
6254+
1. Redistributions of source code must retain the above copyright
6255+
notice, this list of conditions and the following disclaimer.
6256+
6257+
2. Redistributions in binary form must reproduce the above
6258+
copyright notice, this list of conditions and the following
6259+
disclaimer in the documentation and/or other materials provided
6260+
with the distribution.
6261+
6262+
THIS SOFTWARE IS PROVIDED BY RICHARD CROWLEY ``AS IS'' AND ANY EXPRESS
6263+
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
6264+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
6265+
DISCLAIMED. IN NO EVENT SHALL RICHARD CROWLEY OR CONTRIBUTORS BE LIABLE
6266+
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
6267+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
6268+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
6269+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
6270+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
6271+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
6272+
THE POSSIBILITY OF SUCH DAMAGE.
6273+
6274+
The views and conclusions contained in the software and documentation
6275+
are those of the authors and should not be interpreted as representing
6276+
official policies, either expressed or implied, of Richard Crowley.
6277+
6278+
62176279
--------------------------------------------------------------------------------
62186280
Dependency : github.com/rs/zerolog
62196281
Version: v1.27.0
@@ -16542,11 +16604,11 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0
1654216604

1654316605
--------------------------------------------------------------------------------
1654416606
Dependency : github.com/elastic/gosigar
16545-
Version: v0.14.3
16607+
Version: v0.14.2
1654616608
Licence type (autodetected): Apache-2.0
1654716609
--------------------------------------------------------------------------------
1654816610

16549-
Contents of probable licence file $GOMODCACHE/github.com/elastic/gosigar@v0.14.3/LICENSE:
16611+
Contents of probable licence file $GOMODCACHE/github.com/elastic/gosigar@v0.14.2/LICENSE:
1655016612

1655116613
Apache License
1655216614
Version 2.0, January 2004
@@ -22266,6 +22328,36 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2226622328
SOFTWARE.
2226722329

2226822330

22331+
--------------------------------------------------------------------------------
22332+
Dependency : github.com/mileusna/useragent
22333+
Version: v1.3.4
22334+
Licence type (autodetected): MIT
22335+
--------------------------------------------------------------------------------
22336+
22337+
Contents of probable licence file $GOMODCACHE/github.com/mileusna/useragent@v1.3.4/LICENSE.md:
22338+
22339+
MIT License
22340+
22341+
Copyright (c) 2017 Miloš Mileusnić
22342+
22343+
Permission is hereby granted, free of charge, to any person obtaining a copy
22344+
of this software and associated documentation files (the "Software"), to deal
22345+
in the Software without restriction, including without limitation the rights
22346+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22347+
copies of the Software, and to permit persons to whom the Software is
22348+
furnished to do so, subject to the following conditions:
22349+
22350+
The above copyright notice and this permission notice shall be included in all
22351+
copies or substantial portions of the Software.
22352+
22353+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22354+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22355+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22356+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22357+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22358+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22359+
SOFTWARE.
22360+
2226922361
--------------------------------------------------------------------------------
2227022362
Dependency : github.com/mitchellh/colorstring
2227122363
Version: v0.0.0-20190213212951-d06e56a500db

_meta/config/common.reference.p2.yml.tmpl

+48
Original file line numberDiff line numberDiff line change
@@ -272,4 +272,52 @@ agent.logging.to_stderr: true
272272
# Set to true to log messages in JSON format.
273273
#agent.logging.json: false
274274

275+
#=============================== Events Logging ===============================
276+
# Some outputs will log raw events on errors like indexing errors in the
277+
# Elasticsearch output, to prevent logging raw events (that may contain
278+
# sensitive information) together with other log messages, a different
279+
# log file, only for log entries containing raw events, is used. It will
280+
# use the same level, selectors and all other configurations from the
281+
# default logger, but it will have it's own file configuration.
282+
#
283+
# Having a different log file for raw events also prevents event data
284+
# from drowning out the regular log files.
285+
#
286+
# IMPORTANT: No matter the default logger output configuration, raw events
287+
# will **always** be logged to a file configured by `agent.logging.event_data.files`.
288+
289+
# agent.logging.event_data:
290+
# Logging to rotating files. Set agent.logging.to_files to false to disable logging to
291+
# files.
292+
#agent.logging.event_data.to_files: true
293+
#agent.logging.event_data:
294+
# Configure the path where the logs are written. The default is the logs directory
295+
# under the home path (the binary location).
296+
#path: /var/log/filebeat
297+
298+
# The name of the files where the logs are written to.
299+
#name: filebeat-event-data
300+
301+
# Configure log file size limit. If the limit is reached, log file will be
302+
# automatically rotated.
303+
#rotateeverybytes: 5242880 # = 5MB
304+
305+
# Number of rotated log files to keep. The oldest files will be deleted first.
306+
#keepfiles: 2
307+
308+
# The permissions mask to apply when rotating log files. The default value is 0600.
309+
# Must be a valid Unix-style file permissions mask expressed in octal notation.
310+
#permissions: 0600
311+
312+
# Enable log file rotation on time intervals in addition to the size-based rotation.
313+
# Intervals must be at least 1s. Values of 1m, 1h, 24h, 7*24h, 30*24h, and 365*24h
314+
# are boundary-aligned with minutes, hours, days, weeks, months, and years as
315+
# reported by the local system clock. All other intervals are calculated from the
316+
# Unix epoch. Defaults to disabled.
317+
#interval: 0
318+
319+
# Rotate existing logs on startup rather than appending them to the existing
320+
# file. Defaults to false.
321+
# rotateonstartup: false
322+
275323
{{template "providers.yml.tmpl" .}}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# Kind can be one of:
2+
# - breaking-change: a change to previously-documented behavior
3+
# - deprecation: functionality that is being removed in a later release
4+
# - bug-fix: fixes a problem in a previous version
5+
# - enhancement: extends functionality but does not break or fix existing behavior
6+
# - feature: new functionality
7+
# - known-issue: problems that we are aware of in a given version
8+
# - security: impacts on the security of a product or a user’s deployment.
9+
# - upgrade: important information for someone upgrading from a prior version
10+
# - other: does not fit into any of the other categories
11+
kind: feature
12+
13+
# Change summary; a 80ish characters long description of the change.
14+
summary: Log raw events to a separate log file
15+
16+
# Long description; in case the summary is not enough to describe the change
17+
# this field accommodate a description without length limits.
18+
# NOTE: This field will be rendered only for breaking-change and known-issue kinds at the moment.
19+
description: |
20+
Log entries from Elastic-Agent inputs containing event data are now
21+
directed to a different file under the 'events' folder in the logs
22+
directory. This file is not sent to the monitoring output, however
23+
it can be retrieved by collecting a diagnostics.
24+
25+
# Affected component; usually one of "elastic-agent", "fleet-server", "filebeat", "metricbeat", "auditbeat", "all", etc.
26+
component: elastic-agent
27+
28+
# PR URL; optional; the PR number that added the changeset.
29+
# If not present is automatically filled by the tooling finding the PR where this changelog fragment has been added.
30+
# NOTE: the tooling supports backports, so it's able to fill the original PR number instead of the backport PR number.
31+
# Please provide it if you are adding a fragment for a different PR.
32+
pr: https://github.com/elastic/elastic-agent/pull/4549
33+
34+
# Issue URL; optional; the GitHub issue related to this changeset (either closes or is part of).
35+
# If not present is automatically filled by the tooling with the issue linked to the PR number.
36+
#issue: https://github.com/owner/repo/1234

docs/elastic-agent-logging.md

+10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ configuration is:
4444
- ECS/JSON encoded
4545
- UTC timestamps
4646

47+
There is also a second file output for events that is configured via
48+
`agent.logging.event_data`. It shares the same log level as the main
49+
logger and can only be configured for standalone agents. For
50+
Fleet-Managed agents it will always use the default values:
51+
- 5Mb per log file
52+
- Maximum of 2 log files
53+
- Do not rotate on startup
54+
- ECS/JSON encoded
55+
- UTC timestamps
56+
4757
## Default logging
4858
The default logger is the easiest to discover because it's user
4959
configurable, logs to the Agent's root directory and can output to

elastic-agent.reference.yml

+48
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,54 @@ agent.logging.to_stderr: true
278278
# Set to true to log messages in JSON format.
279279
#agent.logging.json: false
280280

281+
#=============================== Events Logging ===============================
282+
# Some outputs will log raw events on errors like indexing errors in the
283+
# Elasticsearch output, to prevent logging raw events (that may contain
284+
# sensitive information) together with other log messages, a different
285+
# log file, only for log entries containing raw events, is used. It will
286+
# use the same level, selectors and all other configurations from the
287+
# default logger, but it will have it's own file configuration.
288+
#
289+
# Having a different log file for raw events also prevents event data
290+
# from drowning out the regular log files.
291+
#
292+
# IMPORTANT: No matter the default logger output configuration, raw events
293+
# will **always** be logged to a file configured by `agent.logging.event_data.files`.
294+
295+
# agent.logging.event_data:
296+
# Logging to rotating files. Set agent.logging.to_files to false to disable logging to
297+
# files.
298+
#agent.logging.event_data.to_files: true
299+
#agent.logging.event_data:
300+
# Configure the path where the logs are written. The default is the logs directory
301+
# under the home path (the binary location).
302+
#path: /var/log/filebeat
303+
304+
# The name of the files where the logs are written to.
305+
#name: filebeat-event-data
306+
307+
# Configure log file size limit. If the limit is reached, log file will be
308+
# automatically rotated.
309+
#rotateeverybytes: 5242880 # = 5MB
310+
311+
# Number of rotated log files to keep. The oldest files will be deleted first.
312+
#keepfiles: 2
313+
314+
# The permissions mask to apply when rotating log files. The default value is 0600.
315+
# Must be a valid Unix-style file permissions mask expressed in octal notation.
316+
#permissions: 0600
317+
318+
# Enable log file rotation on time intervals in addition to the size-based rotation.
319+
# Intervals must be at least 1s. Values of 1m, 1h, 24h, 7*24h, 30*24h, and 365*24h
320+
# are boundary-aligned with minutes, hours, days, weeks, months, and years as
321+
# reported by the local system clock. All other intervals are calculated from the
322+
# Unix epoch. Defaults to disabled.
323+
#interval: 0
324+
325+
# Rotate existing logs on startup rather than appending them to the existing
326+
# file. Defaults to false.
327+
# rotateonstartup: false
328+
281329
# Providers
282330

283331
# Providers supply the key/values pairs that are used for variable substitution

go.mod

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
module github.com/elastic/elastic-agent
22

3-
go 1.21.0
4-
5-
toolchain go1.21.10
3+
go 1.21.10
64

75
require (
86
github.com/Microsoft/go-winio v0.6.1
@@ -23,6 +21,7 @@ require (
2321
github.com/elastic/go-licenser v0.4.1
2422
github.com/elastic/go-sysinfo v1.14.0
2523
github.com/elastic/go-ucfg v0.8.8
24+
github.com/elastic/mock-es v0.0.0-20240605193845-b5546a703d6f
2625
github.com/fatih/color v1.15.0
2726
github.com/fsnotify/fsnotify v1.7.0
2827
github.com/gofrs/flock v0.8.1
@@ -46,6 +45,7 @@ require (
4645
github.com/otiai10/copy v1.14.0
4746
github.com/pierrre/gotestcover v0.0.0-20160517101806-924dca7d15f0
4847
github.com/pkg/errors v0.9.1
48+
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
4949
github.com/rs/zerolog v1.27.0
5050
github.com/sajari/regression v1.0.1
5151
github.com/schollz/progressbar/v3 v3.13.1
@@ -84,6 +84,8 @@ require (
8484
)
8585

8686
require (
87+
github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e // indirect
88+
github.com/distribution/reference v0.5.0 // indirect
8789
// open telemetry dependencies
8890
github.com/open-telemetry/opentelemetry-collector-contrib/exporter/elasticsearchexporter v0.102.0
8991
github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.102.0
@@ -121,19 +123,17 @@ require (
121123
github.com/armon/go-radix v1.0.0 // indirect
122124
github.com/beorn7/perks v1.0.1 // indirect
123125
github.com/bmatcuk/doublestar/v4 v4.6.1 // indirect
124-
github.com/cavaliercoder/badio v0.0.0-20160213150051-ce5280129e9e // indirect
125126
github.com/cespare/xxhash/v2 v2.3.0 // indirect
126127
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
127128
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
128-
github.com/distribution/reference v0.5.0 // indirect
129129
github.com/dnephin/pflag v1.0.7 // indirect
130130
github.com/docker/docker v25.0.5+incompatible // indirect
131131
github.com/docker/go-connections v0.5.0 // indirect
132132
github.com/elastic/go-docappender/v2 v2.1.3 // indirect
133133
github.com/elastic/go-elasticsearch/v7 v7.17.10 // indirect
134134
github.com/elastic/go-structform v0.0.10 // indirect
135135
github.com/elastic/go-windows v1.0.1 // indirect
136-
github.com/elastic/gosigar v0.14.3 // indirect
136+
github.com/elastic/gosigar v0.14.2 // indirect
137137
github.com/elastic/pkcs8 v1.0.0 // indirect
138138
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
139139
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
@@ -180,6 +180,7 @@ require (
180180
github.com/mattn/go-colorable v0.1.13 // indirect
181181
github.com/mattn/go-isatty v0.0.17 // indirect
182182
github.com/mattn/go-runewidth v0.0.15 // indirect
183+
github.com/mileusna/useragent v1.3.4 // indirect
183184
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
184185
github.com/mitchellh/copystructure v1.2.0 // indirect
185186
github.com/mitchellh/go-homedir v1.1.0 // indirect

go.sum

+8-2
Original file line numberDiff line numberDiff line change
@@ -827,8 +827,10 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6
827827
github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0=
828828
github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss=
829829
github.com/elastic/gojsonschema v1.2.1/go.mod h1:biw5eBS2Z4T02wjATMRSfecfjCmwaDPvuaqf844gLrg=
830-
github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo=
831-
github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
830+
github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4=
831+
github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs=
832+
github.com/elastic/mock-es v0.0.0-20240605193845-b5546a703d6f h1:qo0Nn9G+p7HbG+CmiWwSoiKJ/cyRq59TRn9Z2PRHTi8=
833+
github.com/elastic/mock-es v0.0.0-20240605193845-b5546a703d6f/go.mod h1:mVdKBYYwt30xRFjCegbcURHh+3LWOCkQM33fgWbUiRI=
832834
github.com/elastic/package-spec/v2 v2.6.0/go.mod h1:ks9/FaVOS+vCrGRQcDvXAd2FlmB84mrLikbRiO6ACuk=
833835
github.com/elastic/pkcs8 v1.0.0 h1:HhitlUKxhN288kcNcYkjW6/ouvuwJWd9ioxpjnD9jVA=
834836
github.com/elastic/pkcs8 v1.0.0/go.mod h1:ipsZToJfq1MxclVTwpG7U/bgeDtf+0HkUiOxebk95+0=
@@ -1408,6 +1410,8 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju
14081410
github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
14091411
github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
14101412
github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
1413+
github.com/mileusna/useragent v1.3.4 h1:MiuRRuvGjEie1+yZHO88UBYg8YBC/ddF6T7F56i3PCk=
1414+
github.com/mileusna/useragent v1.3.4/go.mod h1:3d8TOmwL/5I8pJjyVDteHtgDGcefrFUX4ccGOMKNYYc=
14111415
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
14121416
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
14131417
github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
@@ -1692,6 +1696,8 @@ github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0ua
16921696
github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek=
16931697
github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk=
16941698
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
1699+
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
1700+
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
16951701
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
16961702
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
16971703
github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=

0 commit comments

Comments
 (0)