https://github.com/go-logr/logr
logger logging
Score: 35.2269424363106
Last synced: about 17 hours ago
JSON representation
Repository metadata:
A simple logging interface for Go
- Host: GitHub
- URL: https://github.com/go-logr/logr
- Owner: go-logr
- License: apache-2.0
- Created: 2017-01-17T04:32:26.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2026-05-11T07:09:38.000Z (8 days ago)
- Last Synced: 2026-05-15T06:49:48.602Z (4 days ago)
- Topics: logger, logging
- Language: Go
- Homepage:
- Size: 584 KB
- Stars: 1,396
- Watchers: 16
- Forks: 87
- Open Issues: 12
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Security: SECURITY.md
Owner metadata:
- Name: go-logr
- Login: go-logr
- Email:
- Kind: organization
- Description:
- Website:
- Location:
- Twitter:
- Company:
- Icon url: https://avatars.githubusercontent.com/u/25166571?v=4
- Repositories: 6
- Last Synced at: 2023-03-06T08:30:38.013Z
- Profile URL: https://github.com/go-logr
GitHub Events
Total
- Create event: 67
- Delete event: 60
- Fork event: 11
- Issue comment event: 26
- Issues event: 8
- Pull request event: 222
- Pull request review comment event: 5
- Pull request review event: 32
- Push event: 54
- Release event: 1
- Watch event: 100
- Total: 586
Last Year
- Create event: 31
- Delete event: 23
- Fork event: 2
- Issue comment event: 10
- Issues event: 4
- Pull request event: 141
- Pull request review comment event: 1
- Pull request review event: 10
- Push event: 20
- Release event: 1
- Watch event: 33
- Total: 276
Committers metadata
Last synced: 4 days ago
Total Commits: 379
Total Committers: 25
Avg Commits per committer: 15.16
Development Distribution Score (DDS): 0.536
Commits in past year: 56
Committers in past year: 2
Avg Commits per committer in past year: 28.0
Development Distribution Score (DDS) in past year: 0.071
| Name | Commits | |
|---|---|---|
| dependabot[bot] | 4****] | 176 |
| Tim Hockin | t****n@g****m | 127 |
| Patrick Ohly | p****y@i****m | 34 |
| Solly Ross | s****s@r****m | 9 |
| Pedro Kaj Kjellerup Nacht | p****t@g****m | 7 |
| Konrad Wojas | g****b@m****l | 4 |
| Ian Davis | n****m@i****m | 2 |
| hn8 | 1****8 | 2 |
| David Lanouette | D****e@G****m | 2 |
| Shailesh Pant | p****h@p****m | 1 |
| Alexis Jeandeau | a****u@g****m | 1 |
| Ashley Davis | a****s@j****o | 1 |
| Balki | 1****i | 1 |
| Benjamin Elder | b****r@g****m | 1 |
| Christian Hoeppner | h****i@g****m | 1 |
| James Chacon | j****n@s****m | 1 |
| Quentin Barrand | q****n@q****r | 1 |
| Sean Liao | s****o@g****m | 1 |
| Simon Sawert | s****n@s****e | 1 |
| Timon Wong | t****g@g****m | 1 |
| Tony Li | t****s@g****m | 1 |
| liranp | l****k@g****m | 1 |
| tyler-at-fast | 6****t | 1 |
| vvakame | v****v@g****m | 1 |
| 罗泽轩 | s****x@g****m | 1 |
Issue and Pull Request metadata
Last synced: 2 days ago
Total issues: 66
Total pull requests: 355
Average time to close issues: about 1 month
Average time to close pull requests: 9 days
Total issue authors: 38
Total pull request authors: 16
Average comments per issue: 4.09
Average comments per pull request: 0.69
Merged pull request: 304
Bot issues: 0
Bot pull requests: 255
Past year issues: 2
Past year pull requests: 34
Past year average time to close issues: 3 days
Past year average time to close pull requests: 1 day
Past year issue authors: 2
Past year pull request authors: 2
Past year average comments per issue: 7.5
Past year average comments per pull request: 0.06
Past year merged pull request: 22
Past year bot issues: 0
Past year bot pull requests: 33
Top Issue Authors
- thockin (16)
- pohly (8)
- pnacht (3)
- wojas (2)
- Dentrax (2)
- DazWilkin (2)
- fovgrubby128 (2)
- jba (1)
- rollulus (1)
- ahmetb (1)
- avorima (1)
- MadVikingGod (1)
- lpar (1)
- spacewander (1)
- zwpaper (1)
Top Pull Request Authors
- dependabot[bot] (255)
- thockin (57)
- pohly (27)
- hn8 (2)
- logikone (2)
- pnacht (2)
- vvakame (1)
- hoeppi-google (1)
- balki (1)
- wojas (1)
- tonglil (1)
- timonwong (1)
- sfc-gh-jchacon (1)
- jelmer (1)
- jeandeaual (1)
Top Issue Labels
Top Pull Request Labels
- dependencies (255)
- github_actions (56)
Package metadata
- Total packages: 15
- Total downloads: unknown
- Total docker downloads: 56,535,761,674
- Total dependent packages: 36,835 (may contain duplicates)
- Total dependent repositories: 50,012 (may contain duplicates)
- Total versions: 124
proxy.golang.org: github.com/go-logr/logr
Package logr defines a general-purpose logging API and abstract interfaces to back that API. Packages in the Go ecosystem can depend on this package, while callers can implement logging with whatever backend is appropriate. Logging is done using a Logger instance. Logger is a concrete type with methods, which defers the actual logging to a LogSink interface. The main methods of Logger are Info() and Error(). Arguments to Info() and Error() are key/value pairs rather than printf-style formatted strings, emphasizing "structured logging". With Go's standard log package, we might write: With logr's structured logging, we'd write: Errors are much the same. Instead of: We'd write: Info() and Error() are very similar, but they are separate methods so that LogSink implementations can choose to do things like attach additional information (such as stack traces) on calls to Error(). Error() messages are always logged, regardless of the current verbosity. If there is no error instance available, passing nil is valid. Often we want to log information only when the application in "verbose mode". To write log lines that are more verbose, Logger has a V() method. The higher the V-level of a log line, the less critical it is considered. Log-lines with V-levels that are not enabled (as per the LogSink) will not be written. Level V(0) is the default, and logger.V(0).Info() has the same meaning as logger.Info(). Negative V-levels have the same meaning as V(0). Error messages do not have a verbosity level and are always logged. Where we might have written: We can write: Logger instances can have name strings so that all messages logged through that instance have additional context. For example, you might want to add a subsystem name: The WithName() method returns a new Logger, which can be passed to constructors or other functions for further use. Repeated use of WithName() will accumulate name "segments". These name segments will be joined in some way by the LogSink implementation. It is strongly recommended that name segments contain simple identifiers (letters, digits, and hyphen), and do not contain characters that could muddle the log output or confuse the joining operation (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). Logger instances can store any number of key/value pairs, which will be logged alongside all messages logged through that instance. For example, you might want to create a Logger instance per managed object: With the standard log package, we might write: With logr we'd write: Logger has very few hard rules, with the goal that LogSink implementations might have a lot of freedom to differentiate. There are, however, some things to consider. The log message consists of a constant message attached to the log line. This should generally be a simple description of what's occurring, and should never be a format string. Variable information can then be attached using named values. Keys are arbitrary strings, but should generally be constant values. Values may be any Go value, but how the value is formatted is determined by the LogSink implementation. Logger instances are meant to be passed around by value. Code that receives such a value can call its methods without having to check whether the instance is ready for use. The zero logger (= Logger{}) is identical to Discard() and discards all log entries. Code that receives a Logger by value can simply call it, the methods will never crash. For cases where passing a logger is optional, a pointer to Logger should be used. Keys are not strictly required to conform to any specification or regex, but it is recommended that they: These guidelines help ensure that log data is processed properly regardless of the log implementation. For example, log implementations will try to output JSON data or will store data for later database (e.g. SQL) queries. While users are generally free to use key names of their choice, it's generally best to avoid using the following keys, as they're frequently used by implementations: Implementations are encouraged to make use of these keys to represent the above concepts, when necessary (for example, in a pure-JSON output form, it would be necessary to represent at least message and timestamp as ordinary named values). Implementations may choose to give callers access to the underlying logging implementation. The recommended pattern for this is: Logger grants access to the sink to enable type assertions like this: Custom `With*` functions can be implemented by copying the complete Logger struct and replacing the sink in the copy: Don't use New to construct a new Logger with a LogSink retrieved from an existing Logger. Source code attribution might not work correctly and unexported fields in Logger get lost. Beware that the same LogSink instance may be shared by different logger instances. Calling functions that modify the LogSink will affect all of those.
- Homepage: https://github.com/go-logr/logr
- Documentation: https://pkg.go.dev/github.com/go-logr/logr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 12 months ago)
- Last Synced: 2026-05-16T14:51:18.844Z (2 days ago)
- Versions: 20
- Dependent Packages: 36,835
- Dependent Repositories: 50,012
- Docker Downloads: 56,535,761,674
-
Rankings:
- Docker downloads count: 0.004%
- Dependent packages count: 0.009%
- Dependent repos count: 0.024%
- Average: 1.008%
- Stargazers count: 2.044%
- Forks count: 2.961%
proxy.golang.org: github.com/Go-Logr/logr
Package logr defines abstract interfaces for logging. Packages can depend on these interfaces and callers can implement logging in whatever way is appropriate. This design derives from Dave Cheney's blog: This is a BETA grade API. Until there is a significant 2nd implementation, I don't really know how it will change. The logging specifically makes it non-trivial to use format strings, to encourage attaching structured information instead of unstructured format strings. Logging is done using a Logger. Loggers can have name prefixes and named values attached, so that all log messages logged with that Logger have some base context associated. The term "key" is used to refer to the name associated with a particular value, to disambiguate it from the general Logger name. For instance, suppose we're trying to reconcile the state of an object, and we want to log that we've made some decision. With the traditional log package, we might write With logr's structured logging, we'd write Depending on our logging implementation, we could then make logging decisions based on field values (like only logging such events for objects in a certain namespace), or copy the structured information into a structured log store. For logging errors, Logger has a method called Error. Suppose we wanted to log an error while reconciling. With the traditional log package, we might write With logr, we'd instead write This functions similarly to: However, it ensures that a standard key for the error value ("error") is used across all error logging. Furthermore, certain implementations may choose to attach additional information (such as stack traces) on calls to Error, so it's preferred to use Error to log errors. Each log message from a Logger has four types of context: logger name, log verbosity, log message, and the named values. The Logger name constists of a series of name "segments" added by successive calls to WithName. These name segments will be joined in some way by the underlying implementation. It is strongly reccomended that name segements contain simple identifiers (letters, digits, and hyphen), and do not contain characters that could muddle the log output or confuse the joining operation (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). Log verbosity represents how little a log matters. Level zero, the default, matters most. Increasing levels matter less and less. Try to avoid lots of different verbosity levels, and instead provide useful keys, logger names, and log messages for users to filter on. It's illegal to pass a log level below zero. The log message consists of a constant message attached to the the log line. This should generally be a simple description of what's occuring, and should never be a format string. Variable information can then be attached using named values (key/value pairs). Keys are arbitrary strings, while values may be any Go value. While users are generally free to use key names of their choice, it's generally best to avoid using the following keys, as they're frequently used by implementations: Implementations are encouraged to make use of these keys to represent the above concepts, when neccessary (for example, in a pure-JSON output form, it would be necessary to represent at least message and timestamp as ordinary named values).
- Homepage: https://github.com/Go-Logr/logr
- Documentation: https://pkg.go.dev/github.com/Go-Logr/logr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 12 months ago)
- Last Synced: 2026-05-15T06:08:05.008Z (4 days ago)
- Versions: 20
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Stargazers count: 2.211%
- Forks count: 3.257%
- Average: 4.04%
- Dependent packages count: 5.173%
- Dependent repos count: 5.52%
proxy.golang.org: github.com/go-logr/Logr
Package logr defines abstract interfaces for logging. Packages can depend on these interfaces and callers can implement logging in whatever way is appropriate. This design derives from Dave Cheney's blog: This is a BETA grade API. Until there is a significant 2nd implementation, I don't really know how it will change. The logging specifically makes it non-trivial to use format strings, to encourage attaching structured information instead of unstructured format strings. Logging is done using a Logger. Loggers can have name prefixes and named values attached, so that all log messages logged with that Logger have some base context associated. The term "key" is used to refer to the name associated with a particular value, to disambiguate it from the general Logger name. For instance, suppose we're trying to reconcile the state of an object, and we want to log that we've made some decision. With the traditional log package, we might write With logr's structured logging, we'd write Depending on our logging implementation, we could then make logging decisions based on field values (like only logging such events for objects in a certain namespace), or copy the structured information into a structured log store. For logging errors, Logger has a method called Error. Suppose we wanted to log an error while reconciling. With the traditional log package, we might write With logr, we'd instead write This functions similarly to: However, it ensures that a standard key for the error value ("error") is used across all error logging. Furthermore, certain implementations may choose to attach additional information (such as stack traces) on calls to Error, so it's preferred to use Error to log errors. Each log message from a Logger has four types of context: logger name, log verbosity, log message, and the named values. The Logger name constists of a series of name "segments" added by successive calls to WithName. These name segments will be joined in some way by the underlying implementation. It is strongly reccomended that name segements contain simple identifiers (letters, digits, and hyphen), and do not contain characters that could muddle the log output or confuse the joining operation (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). Log verbosity represents how little a log matters. Level zero, the default, matters most. Increasing levels matter less and less. Try to avoid lots of different verbosity levels, and instead provide useful keys, logger names, and log messages for users to filter on. It's illegal to pass a log level below zero. The log message consists of a constant message attached to the the log line. This should generally be a simple description of what's occuring, and should never be a format string. Variable information can then be attached using named values (key/value pairs). Keys are arbitrary strings, while values may be any Go value. While users are generally free to use key names of their choice, it's generally best to avoid using the following keys, as they're frequently used by implementations: Implementations are encouraged to make use of these keys to represent the above concepts, when neccessary (for example, in a pure-JSON output form, it would be necessary to represent at least message and timestamp as ordinary named values).
- Homepage: https://github.com/go-logr/Logr
- Documentation: https://pkg.go.dev/github.com/go-logr/Logr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 12 months ago)
- Last Synced: 2026-05-15T06:08:51.565Z (4 days ago)
- Versions: 20
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Stargazers count: 2.209%
- Forks count: 3.264%
- Average: 4.049%
- Dependent packages count: 5.187%
- Dependent repos count: 5.535%
proxy.golang.org: github.com/go-Logr/Logr
Package logr defines abstract interfaces for logging. Packages can depend on these interfaces and callers can implement logging in whatever way is appropriate. This design derives from Dave Cheney's blog: This is a BETA grade API. Until there is a significant 2nd implementation, I don't really know how it will change. The logging specifically makes it non-trivial to use format strings, to encourage attaching structured information instead of unstructured format strings. Logging is done using a Logger. Loggers can have name prefixes and named values attached, so that all log messages logged with that Logger have some base context associated. The term "key" is used to refer to the name associated with a particular value, to disambiguate it from the general Logger name. For instance, suppose we're trying to reconcile the state of an object, and we want to log that we've made some decision. With the traditional log package, we might write With logr's structured logging, we'd write Depending on our logging implementation, we could then make logging decisions based on field values (like only logging such events for objects in a certain namespace), or copy the structured information into a structured log store. For logging errors, Logger has a method called Error. Suppose we wanted to log an error while reconciling. With the traditional log package, we might write With logr, we'd instead write This functions similarly to: However, it ensures that a standard key for the error value ("error") is used across all error logging. Furthermore, certain implementations may choose to attach additional information (such as stack traces) on calls to Error, so it's preferred to use Error to log errors. Each log message from a Logger has four types of context: logger name, log verbosity, log message, and the named values. The Logger name constists of a series of name "segments" added by successive calls to WithName. These name segments will be joined in some way by the underlying implementation. It is strongly reccomended that name segements contain simple identifiers (letters, digits, and hyphen), and do not contain characters that could muddle the log output or confuse the joining operation (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). Log verbosity represents how little a log matters. Level zero, the default, matters most. Increasing levels matter less and less. Try to avoid lots of different verbosity levels, and instead provide useful keys, logger names, and log messages for users to filter on. It's illegal to pass a log level below zero. The log message consists of a constant message attached to the the log line. This should generally be a simple description of what's occuring, and should never be a format string. Variable information can then be attached using named values (key/value pairs). Keys are arbitrary strings, while values may be any Go value. While users are generally free to use key names of their choice, it's generally best to avoid using the following keys, as they're frequently used by implementations: Implementations are encouraged to make use of these keys to represent the above concepts, when neccessary (for example, in a pure-JSON output form, it would be necessary to represent at least message and timestamp as ordinary named values).
- Homepage: https://github.com/go-Logr/Logr
- Documentation: https://pkg.go.dev/github.com/go-Logr/Logr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 12 months ago)
- Last Synced: 2026-05-15T06:08:03.346Z (4 days ago)
- Versions: 20
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Stargazers count: 1.316%
- Forks count: 1.84%
- Average: 4.875%
- Dependent packages count: 6.999%
- Dependent repos count: 9.346%
proxy.golang.org: github.com/go-logr/logr/funcr
Package funcr implements formatting of structured log messages and optionally captures the call site and timestamp. The simplest way to use it is via its implementation of a github.com/go-logr/logr.LogSink with output through an arbitrary "write" function. See New and NewJSON for details. For users who need more control, a funcr.Formatter can be embedded inside your own custom LogSink implementation. This is useful when the LogSink needs to implement additional methods, for example. This will respect logr.Marshaler, fmt.Stringer, and error interfaces for values which are being logged. When rendering a struct, funcr will use Go's standard JSON tags (all except "string").
- Homepage: https://github.com/go-logr/logr
- Documentation: https://pkg.go.dev/github.com/go-logr/logr/funcr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 11 days ago)
- Last Synced: 2026-05-15T06:07:32.507Z (4 days ago)
- Versions: 15
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent packages count: 4.771%
- Average: 4.931%
- Dependent repos count: 5.092%
proxy.golang.org: github.com/go-lOGR/logr
Package logr defines abstract interfaces for logging. Packages can depend on these interfaces and callers can implement logging in whatever way is appropriate. This design derives from Dave Cheney's blog: This is a BETA grade API. Until there is a significant 2nd implementation, I don't really know how it will change. The logging specifically makes it non-trivial to use format strings, to encourage attaching structured information instead of unstructured format strings. Logging is done using a Logger. Loggers can have name prefixes and named values attached, so that all log messages logged with that Logger have some base context associated. The term "key" is used to refer to the name associated with a particular value, to disambiguate it from the general Logger name. For instance, suppose we're trying to reconcile the state of an object, and we want to log that we've made some decision. With the traditional log package, we might write With logr's structured logging, we'd write Depending on our logging implementation, we could then make logging decisions based on field values (like only logging such events for objects in a certain namespace), or copy the structured information into a structured log store. For logging errors, Logger has a method called Error. Suppose we wanted to log an error while reconciling. With the traditional log package, we might write With logr, we'd instead write This functions similarly to: However, it ensures that a standard key for the error value ("error") is used across all error logging. Furthermore, certain implementations may choose to attach additional information (such as stack traces) on calls to Error, so it's preferred to use Error to log errors. Each log message from a Logger has four types of context: logger name, log verbosity, log message, and the named values. The Logger name constists of a series of name "segments" added by successive calls to WithName. These name segments will be joined in some way by the underlying implementation. It is strongly reccomended that name segements contain simple identifiers (letters, digits, and hyphen), and do not contain characters that could muddle the log output or confuse the joining operation (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). Log verbosity represents how little a log matters. Level zero, the default, matters most. Increasing levels matter less and less. Try to avoid lots of different verbosity levels, and instead provide useful keys, logger names, and log messages for users to filter on. It's illegal to pass a log level below zero. The log message consists of a constant message attached to the the log line. This should generally be a simple description of what's occuring, and should never be a format string. Variable information can then be attached using named values (key/value pairs). Keys are arbitrary strings, while values may be any Go value. While users are generally free to use key names of their choice, it's generally best to avoid using the following keys, as they're frequently used by implementations: Implementations are encouraged to make use of these keys to represent the above concepts, when neccessary (for example, in a pure-JSON output form, it would be necessary to represent at least message and timestamp as ordinary named values).
- Homepage: https://github.com/go-lOGR/logr
- Documentation: https://pkg.go.dev/github.com/go-lOGR/logr#section-documentation
- Licenses: Apache-2.0
- Latest release: v1.4.3 (published 12 months ago)
- Last Synced: 2026-05-15T06:08:36.300Z (4 days ago)
- Versions: 20
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent packages count: 4.948%
- Average: 5.114%
- Dependent repos count: 5.28%
debian-12: golang-github-go-logr-logr
- Homepage: https://github.com/go-logr/logr
- Documentation: https://packages.debian.org/bookworm/golang-github-go-logr-logr
- Licenses:
- Latest release: 1.2.3-1 (published 3 months ago)
- Last Synced: 2026-03-12T20:11:52.273Z (2 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
debian-13: golang-github-go-logr-logr
- Homepage: https://github.com/go-logr/logr
- Documentation: https://packages.debian.org/trixie/golang-github-go-logr-logr
- Licenses:
- Latest release: 1.4.2-2 (published 3 months ago)
- Last Synced: 2026-03-13T20:10:24.124Z (2 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
guix: go-github-com-go-logr-logr
Minimal logging API for Go
- Homepage: https://github.com/go-logr/logr
- Documentation: https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/golang-xyz.scm#n10866
- Licenses: asl2.0
- Latest release: 1.4.2 (published 3 months ago)
- Last Synced: 2026-04-27T18:18:33.069Z (21 days ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
debian-11: golang-github-go-logr-logr
- Homepage: https://github.com/go-logr/logr
- Documentation: https://packages.debian.org/bullseye/golang-github-go-logr-logr
- Licenses:
- Latest release: 0.4.0-1 (published 3 months ago)
- Last Synced: 2026-03-14T15:33:39.182Z (2 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
Dependencies
- actions/checkout v2 composite
- actions/setup-go v2 composite
- actions/github-script v6 composite
- actions/checkout v2 composite
- golangci/golangci-lint-action v2 composite
- actions/checkout v2 composite
- actions/setup-go v2 composite
- actions/checkout 8ade135a41bc03ea155e62e844d188df1ea18608 composite
- actions/upload-artifact a8a3f3ad30e3422c9c7b888a15615d19a852ae32 composite
- github/codeql-action/upload-sarif ddccb873888234080b77e9bc2d4764d5ccaaccf9 composite
- ossf/scorecard-action 08b4669551908b1024bb425080c797723083c031 composite