{"id":37021309,"url":"https://github.com/elf4j/elf4j-engine","last_synced_at":"2026-01-14T02:30:43.804Z","repository":{"id":143161460,"uuid":"613191733","full_name":"elf4j/elf4j-engine","owner":"elf4j","description":"A stand-alone asynchronous Java log engine, implementing the ELF4J (Easy Logging Facade for Java) API","archived":false,"fork":false,"pushed_at":"2026-01-13T06:41:25.000Z","size":1034,"stargazers_count":6,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-13T09:44:46.080Z","etag":null,"topics":["asynchronous-logger","elf4j","elf4j-engine","java","java-asynchronous-logger","java-asynchronous-programming","java-logger","java-logging-api","java-logging-facade","java-logging-framework","java-logging-service","java-logging-spi","java-platform-logger","json-asynchronous-logger","json-logger","logging-framework","logging-service-provider","slf4j-loggers"],"latest_commit_sha":null,"homepage":"https://elf4j.github.io/elf4j-engine/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elf4j.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"q3769","patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2023-03-13T04:41:15.000Z","updated_at":"2026-01-13T06:41:28.000Z","dependencies_parsed_at":"2023-10-12T14:48:05.423Z","dependency_job_id":"f6188441-1839-4807-8347-4eaa5ee2eeec","html_url":"https://github.com/elf4j/elf4j-engine","commit_stats":null,"previous_names":[],"tags_count":146,"template":false,"template_full_name":null,"purl":"pkg:github/elf4j/elf4j-engine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elf4j%2Felf4j-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elf4j%2Felf4j-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elf4j%2Felf4j-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elf4j%2Felf4j-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elf4j","download_url":"https://codeload.github.com/elf4j/elf4j-engine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elf4j%2Felf4j-engine/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408711,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous-logger","elf4j","elf4j-engine","java","java-asynchronous-logger","java-asynchronous-programming","java-logger","java-logging-api","java-logging-facade","java-logging-framework","java-logging-service","java-logging-spi","java-platform-logger","json-asynchronous-logger","json-logger","logging-framework","logging-service-provider","slf4j-loggers"],"created_at":"2026-01-14T02:30:43.200Z","updated_at":"2026-01-14T02:30:43.797Z","avatar_url":"https://github.com/elf4j.png","language":"Java","readme":"[![Maven Central](https://img.shields.io/maven-central/v/io.github.elf4j/elf4j-engine.svg?label=Maven%20Central)](https://maven-badges.herokuapp.com/maven-central/io.github.elf4j/elf4j-engine)\n\n# elf4j-engine\n\nAn asynchronous Java log engine.\n\nImplementing the [elf4j](https://github.com/elf4j/elf4j) (Easy Logging Facade for Java) API, `elf4j-engine` is the log engine of [elf4j-provider](https://github.com/elf4j/elf4j-provider) - a native logging _service provider_ of the [elf4j](https://github.com/elf4j/) logging facade.\n\nAlso a stand-alone log engine, `elf4j-engine` is designed to be adaptable for servicing other Java logging APIs. E.g.\n\n* It is a log engine for the [SLF4J](https://www.slf4j.org/) API, as in [slf4j-elf4j](https://github.com/elf4j/slf4j-elf4j).\n* It is also a log engine for the Java Platform Logging ([JPL](https://openjdk.org/jeps/264)) API introduced since Java 9, as in [jpl-elf4j](https://github.com/elf4j/jpl-elf4j).\n\n## Getting started...\n\n1. **Install**\n\n   * Prerequisite: Java 8+ for versions older than 16.0.0 (exclusive); Java 21+ for versions newer than 16.0.0 (inclusive).\n\n   * To use this as a logging service provider in your application, see installation details [here](https://github.com/elf4j/elf4j-provider#installation)\n\n2. **Use it for logging in a client application:**\n\n   ```java \n   class ReadmeTest {\n     static Logger logger = Logger.instance();\n   \n     @Test\n     void readMe() {\n       MDC.put(\"ctx-key\", \"ctx-value\");\n       logger.log(\"Hello, world!\");\n       logger.atTrace().log(\"It's a beautiful day\");\n       Logger info = logger.atInfo();\n       info.log(\"... no matter on what level you say it\");\n       Logger warn = info.atWarn();\n       warn.log(\n           \"Houston, we do not have {} but let's do {}\", \"a problem\", (Supplier\u003c?\u003e) () -\u003e \"a drill\");\n       Throwable exception = new Exception(\"This is a drill\");\n       warn.atError().log(exception);\n       logger.atInfo().log(exception, \"When being logged, the Throwable always comes {}\", \"first\");\n       logger.atInfo().log(\n           exception, \"The log {} and {} work as usual\", () -\u003e \"message\", () -\u003e \"arguments\");\n       Logger.instance()\n           .atInfo()\n           .atError()\n           .atWarn()\n           .atTrace()\n           .atDebug()\n           .log(\"Not a practical example but now the severity level is DEBUG\");\n     }\n   }\n   ```\n\n   The `Logger` instance is thread-safe, affording flexible usage.\n\n3. **Run that application**, the following output will appear in stdout:\n\n   ```\n   2025-07-13T11:54:40.384-05:00 INFO elf4j.engine.ReadmeTest - Hello, world!\n   2025-07-13T11:54:40.402-05:00 TRACE elf4j.engine.ReadmeTest - It's a beautiful day\n   2025-07-13T11:54:40.403-05:00 INFO elf4j.engine.ReadmeTest - ... no matter on what level you say it\n   2025-07-13T11:54:40.404-05:00 WARN elf4j.engine.ReadmeTest - Houston, we do not have a problem but let's do a drill\n   2025-07-13T11:54:40.404-05:00 ERROR elf4j.engine.ReadmeTest - \n   java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       at org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:478)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:54:40.405-05:00 INFO elf4j.engine.ReadmeTest - When being logged, the Throwable always comes first\n   java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:54:40.407-05:00 INFO elf4j.Logger - The log message and arguments work as usual\n   java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:54:40.408-05:00 DEBUG elf4j.engine.ReadmeTest - Not a practical example but now the severity level is DEBUG\n   ```\n\n   The output is always asynchronous and won't block the application's normal workflow.\n\n4. **Configure output format patterns** by using a Properties file named `elf4j.properties`, placed in the root of the classpath. For example, with the `elf4j.properties` file:\n\n   ```properties\n   pattern={timestamp} {level:5} {class:simple}#{method}(L{linenumber}@{filename}) - {message}\n   ```\n\n   The output becomes:\n\n   ```\n   2025-07-13T11:59:21.366-05:00 INFO ReadmeTest#readMe(L39@ReadmeTest.java) - Hello, world!\n   2025-07-13T11:59:21.392-05:00 TRACE ReadmeTest#readMe(L40@ReadmeTest.java) - It's a beautiful day\n   2025-07-13T11:59:21.393-05:00 INFO ReadmeTest#readMe(L42@ReadmeTest.java) - ... no matter on what level you say it\n   2025-07-13T11:59:21.393-05:00 WARN ReadmeTest#readMe(L44@ReadmeTest.java) - Houston, we do not have a problem but let's do a drill\n   2025-07-13T11:59:21.394-05:00 ERROR ReadmeTest#readMe(L47@ReadmeTest.java) -\n       java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:59:21.395-05:00 INFO ReadmeTest#readMe(L48@ReadmeTest.java) - When being logged, the Throwable always comes first\n       java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:59:21.398-05:00 INFO Logger#log(L169@Logger.java) - The log message and arguments work as usual\n       java.lang.Exception: This is a drill\n       at elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\n       at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\n       at java.base/java.lang.reflect.Method.invoke(Method.java:580)\n       at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\n       (... full stack trace omitted for this README.md)\n   \n   2025-07-13T11:59:21.398-05:00 DEBUG ReadmeTest#readMe(L57@ReadmeTest.java) - Not a practical example but now the severity level is DEBUG\n   ```\n\n   With the `elf4j.properties` file:\n\n   ```properties\n   pattern={json}\n   ```\n\n   The output becomes:\n\n   ```\n   {\"timestamp\":\"2025-07-20T22:12:07.8777751-05:00\",\"level\":\"INFO\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"Hello, world!\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9013918-05:00\",\"level\":\"TRACE\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"It's a beautiful day\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9024041-05:00\",\"level\":\"INFO\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"... no matter on what level you say it\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9029121-05:00\",\"level\":\"WARN\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"Houston, we do not have a problem but let's do a drill\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9029121-05:00\",\"level\":\"ERROR\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"\",\"exception\":\"java.lang.Exception: This is a drill\\r\\n\\tat elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\\r\\n\\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\\r\\n\\tat java.base/java.lang.reflect.Method.invoke(Method.java:580)\\r\\n\\tat org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\\r\\n\\tat org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:478)\\r\\n\\tat org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$4(TestMethodTestDescriptor.java:221)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:217)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:159)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:157)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:230)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:204)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:172)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:101)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:64)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:150)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:63)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:91)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)\\r\\n\\tat org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:66)\\r\\n\\tat com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)\\r\\n\\tat com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)\\r\\n\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9029121-05:00\",\"level\":\"INFO\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"When being logged, the Throwable always comes first\",\"exception\":\"java.lang.Exception: This is a drill\\r\\n\\tat elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\\r\\n\\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\\r\\n\\tat java.base/java.lang.reflect.Method.invoke(Method.java:580)\\r\\n\\tat org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\\r\\n\\tat org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:478)\\r\\n\\tat org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$4(TestMethodTestDescriptor.java:221)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:217)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:159)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:157)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:230)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:204)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:172)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:101)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:64)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:150)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:63)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:91)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)\\r\\n\\tat org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:66)\\r\\n\\tat com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)\\r\\n\\tat com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)\\r\\n\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9044207-05:00\",\"level\":\"INFO\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"The log message and arguments work as usual\",\"exception\":\"java.lang.Exception: This is a drill\\r\\n\\tat elf4j.engine.ReadmeTest.readMe(ReadmeTest.java:46)\\r\\n\\tat java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)\\r\\n\\tat java.base/java.lang.reflect.Method.invoke(Method.java:580)\\r\\n\\tat org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:787)\\r\\n\\tat org.junit.platform.commons.support.ReflectionSupport.invokeMethod(ReflectionSupport.java:478)\\r\\n\\tat org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:161)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:152)\\r\\n\\tat org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:91)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(InterceptingExecutableInvoker.java:112)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.lambda$invoke$0(InterceptingExecutableInvoker.java:94)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)\\r\\n\\tat org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:93)\\r\\n\\tat org.junit.jupiter.engine.execution.InterceptingExecutableInvoker.invoke(InterceptingExecutableInvoker.java:87)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$4(TestMethodTestDescriptor.java:221)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:217)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:159)\\r\\n\\tat org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:70)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:157)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat java.base/java.util.ArrayList.forEach(ArrayList.java:1596)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:161)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:147)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:145)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:144)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:101)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)\\r\\n\\tat org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.executeEngine(EngineExecutionOrchestrator.java:230)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.failOrExecuteEngine(EngineExecutionOrchestrator.java:204)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:172)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:101)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:64)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:150)\\r\\n\\tat org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:63)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:109)\\r\\n\\tat org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:91)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.lambda$execute$1(InterceptingLauncher.java:39)\\r\\n\\tat org.junit.platform.launcher.core.ClasspathAlignmentCheckingLauncherInterceptor.intercept(ClasspathAlignmentCheckingLauncherInterceptor.java:25)\\r\\n\\tat org.junit.platform.launcher.core.InterceptingLauncher.execute(InterceptingLauncher.java:38)\\r\\n\\tat org.junit.platform.launcher.core.DelegatingLauncher.execute(DelegatingLauncher.java:47)\\r\\n\\tat org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:66)\\r\\n\\tat com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)\\r\\n\\tat com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)\\r\\n\\tat com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:231)\\r\\n\\tat com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)\\r\\n\"}\n   {\"timestamp\":\"2025-07-20T22:12:07.9051298-05:00\",\"level\":\"DEBUG\",\"loggerName\":\"elf4j.engine.ReadmeTest\",\"context\":{\"ctx-key\":\"ctx-value\"},\"message\":\"Not a practical example but now the severity level is DEBUG\"}\n   ```\n\n   The JSON pattern can be configured to pretty-print format, and/or mixed with other patterns.\n\n## Features, usage, and configuration details\n\nFor using elf4j as a logging facade API, see elf4j's [API description](https://github.com/elf4j/elf4j#log-service-interface-and-access-api) and [sample usage](https://github.com/elf4j/elf4j#use-it---for-log-service-api-clients).\n\nFor details of using this as a runtime log engine, see [elf4j-provider](https://github.com/elf4j/elf4j-provider) for [features](https://github.com/elf4j/elf4j-provider#features) and [configuration](https://github.com/elf4j/elf4j-provider#configuration).\n\n## [\"The performance talk\"](https://github.com/elf4j/elf4j-provider#performance)\n\nIt's not how fast you fill up the target log file or repository, it's how fast you relieve the application from logging duty back to its own business.\n","funding_links":["https://github.com/sponsors/q3769"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felf4j%2Felf4j-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felf4j%2Felf4j-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felf4j%2Felf4j-engine/lists"}