{"id":13596259,"url":"https://github.com/huxi/lilith","last_synced_at":"2025-04-09T19:21:12.624Z","repository":{"id":45961717,"uuid":"358370","full_name":"huxi/lilith","owner":"huxi","description":"Lilith is a Logging- and AccessEvent viewer for Logback, log4j, log4j2 and java.util.logging","archived":false,"fork":false,"pushed_at":"2021-12-14T12:54:45.000Z","size":21682,"stargazers_count":140,"open_issues_count":7,"forks_count":18,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-02T12:57:38.280Z","etag":null,"topics":["chainsaw","java","log4j","log4j2","logback","logging"],"latest_commit_sha":null,"homepage":"http://lilith.huxhorn.de","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/huxi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2009-11-02T18:59:22.000Z","updated_at":"2025-02-25T11:23:35.000Z","dependencies_parsed_at":"2022-08-12T12:40:23.296Z","dependency_job_id":null,"html_url":"https://github.com/huxi/lilith","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huxi%2Flilith","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huxi%2Flilith/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huxi%2Flilith/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/huxi%2Flilith/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/huxi","download_url":"https://codeload.github.com/huxi/lilith/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248095153,"owners_count":21046799,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["chainsaw","java","log4j","log4j2","logback","logging"],"created_at":"2024-08-01T16:02:13.615Z","updated_at":"2025-04-09T19:21:12.594Z","avatar_url":"https://github.com/huxi.png","language":"Java","readme":"# Lilith [![Build Status](https://travis-ci.com/huxi/lilith.png?branch=master)](https://travis-ci.com/huxi/lilith) [![Coverage Status](https://coveralls.io/repos/huxi/lilith/badge.png)](https://coveralls.io/r/huxi/lilith) [![Maven Central](https://img.shields.io/maven-central/v/de.huxhorn.lilith/de.huxhorn.lilith.svg)](http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22de.huxhorn.lilith%22)\nLilith ([@lilithapp](https://twitter.com/#!/lilithapp)) is a logging and access event viewer for [Logback][], [log4j][]™, [Log4j 2][log4j2]™ and [java.util.logging][jul].\n\n![Lilith][img-lilith]\n\nIt has features roughly comparable to [Chainsaw][] for log4j™, but with an emphasis on stability, high performance and throughput. In contrast to Chainsaw, it is handling received logging events using the hard disk instead of keeping them in memory. Because of this, it is able to handle millions of events from several sources at the same time.\n\n## Getting started...\n\n### ...with Logback...\n\n#### ...and logback-classic SocketAppender.\n\nLilith is listening for logback-classic [`SocketAppender`][lcsa] connections on port 4445 or port 4560. \n\nA [`SocketAppender`][lcsa]  establishes a connection with exactly one host that is defined in the `RemoteHost` property.\n\nAdd the following to your applications `logback.xml`:\n\n```xml\n\u003cappender name=\"LogbackClassic\" class=\"ch.qos.logback.classic.net.SocketAppender\"\u003e\n  \u003cRemoteHost\u003elocalhost\u003c/RemoteHost\u003e\n  \u003cPort\u003e4560\u003c/Port\u003e\n  \u003cReconnectionDelay\u003e170\u003c/ReconnectionDelay\u003e\n  \u003cIncludeCallerData\u003etrue\u003c/IncludeCallerData\u003e\n\u003c/appender\u003e\n```\n\nYou also have to attach the appender to some logger, e.g. the root logger...\n\n```xml\n\u003croot level=\"INFO\"\u003e\n  \u003cappender-ref ref=\"LogbackClassic\"/\u003e\n\u003c/root\u003e\n```\n\n... or a specific logger...\n\n```xml\n\u003clogger name=\"foo.Bar\" level=\"DEBUG\"\u003e\n  \u003cappender-ref ref=\"LogbackClassic\"/\u003e\n\u003c/logger\u003e\n```\n\nUsing logback-classic [`SocketAppender`][lcsa] requires `ch.qos.logback:logback-classic` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n#### ...and Lilith ClassicMultiplexSocketAppender.\n\nLilith is listening for Lilith [`ClassicMultiplexSocketAppender`][cmsa] connections on port 10000 (compressed) and 10001 (uncompressed). \n\nThe Lilith [`ClassicMultiplexSocketAppender`][cmsa] is a replacement for the logback-classic [`SocketAppender`][lcsa]. \n\nThis appender, in contrast to logbacks, supports `logger.debug(\"{} {}\", new Object[]{foo, bar, throwable)`, i.e. if the last given parameter of a log message is a `Throwable` and it is not used up in the message pattern then it will be used as the `Throwable` of the `LoggingEvent`, similar to `logger.debug(\"\"+foo+\" \"+bar, throwable)`.\n\nWhile logbacks appender is stream-based, i.e. it streams logging events using an `ObjectOutputStream`, the Lilith appender is message based, i.e. it sends logging events one after the other as single messages.\n\nA message consists of an integer that specifies the number of bytes of the following event, followed by the bytes of the serialized event.\n\nThis has several benefits:\n\n* Sending to multiple remote hosts is supported while the event is only serialized once.\n* Events can (and should) be compressed using GZIP.\n* The appender supports heartbeat and timeout. \n  * The event receiver can find out that the event sender connection died if a heartbeat is missing.\n  * The event sender can find out that the event receiver connection died by means of a timeout This means that an application won't stop (at least not for very long) in case of network problem.\n\nThe multiplex appenders are now creating a UUID be default. This enables Lilith to reattach a connection to an existing view after the connection has been lost for some reason. It has the advantage that already executing filters won't have to be restarted for every new connection. The previous behavior can be enforced by disabling the creation of the UUID by means of `\u003cCreatingUUID\u003efalse\u003c/CreatingUUID\u003e` in the Logback configuration.\n  \nAdd the following to your applications `logback.xml`:\n\n```xml\n\u003cappender name=\"multiplex\" class=\"de.huxhorn.lilith.logback.appender.ClassicMultiplexSocketAppender\"\u003e\n  \u003cCompressing\u003etrue\u003c/Compressing\u003e\n  \u003c!-- will automatically use correct default port --\u003e\n  \u003c!-- Default port for compressed is 10000 and uncompressed 10001 --\u003e\n  \u003cReconnectionDelay\u003e10000\u003c/ReconnectionDelay\u003e\n  \u003cIncludeCallerData\u003etrue\u003c/IncludeCallerData\u003e\n  \u003cRemoteHosts\u003elocalhost, 10.200.55.13\u003c/RemoteHosts\u003e\n  \u003c!-- Alternatively:\n  \u003cRemoteHost\u003elocalhost\u003c/RemoteHost\u003e\n  \u003cRemoteHost\u003e10.200.55.13\u003c/RemoteHost\u003e\n  --\u003e\n  \u003c!--\n  Optional:\n  \u003cCreatingUUID\u003efalse\u003c/CreatingUUID\u003e\n  --\u003e\n\u003c/appender\u003e\n```\n\nYou also have to attach the appender to some logger, e.g. the root logger...\n\n```xml\n\u003croot level=\"INFO\"\u003e\n  \u003cappender-ref ref=\"multiplex\"/\u003e\n\u003c/root\u003e\n```\n\n... or a specific logger...\n\n```xml\n\u003clogger name=\"foo.Bar\" level=\"DEBUG\"\u003e\n  \u003cappender-ref ref=\"multiplex\"/\u003e\n\u003c/logger\u003e\n```\n\nUsing Lilith [`ClassicMultiplexSocketAppender`][cmsa] requires `de.huxhorn.lilith:de.huxhorn.lilith.logback.appender.multiplex-classic` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n#### ...and logback-classic with FileAppender.\n\nStarting with Lilith 0.9.38 and Logback 0.9.19, you can write Lilith files directly from within Logback.\n\nThose files can be opened by Lilith using either the Open command or drag\u0026drop.\n\nYou can also use the `tail` and `cat` command available in the executable Lilith jar. This has the huge advantage that you can decide about the [layout pattern][lcpl] of the log file output at the time you are executing the above commands instead of while defining the file appender.\n\n```\n  Commands:\n    cat      Cat the given file.\n      Usage: cat [options] 'cat' the given Lilith logfile.\n        Options:\n          -n, --number-of-lines   number of entries printed by 'cat'.\n                                  Default: -1\n          -p, --pattern           pattern used by 'cat'. See\n                                  http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout and\n                                  http://logback.qos.ch/manual/layouts.html#AccessPatternLayout\n\n    tail      Tail the given file.\n      Usage: tail [options] 'tail' the given Lilith logfile.\n        Options:\n          -f, --keep-running      keep tailing the given Lilith logfile.\n                                  Default: false\n          -n, --number-of-lines   number of entries printed by 'tail'.\n                                  Default: 20\n          -p, --pattern           pattern used by 'tail'. See\n                                  http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout and\n                                  http://logback.qos.ch/manual/layouts.html#AccessPatternLayout\n```\n\nAdd the following to your applications `logback.xml`:\n\n```xml\n\u003cappender name=\"FILE\" class=\"ch.qos.logback.core.FileAppender\"\u003e\n  \u003cfile\u003eclassic.lilith\u003c/file\u003e\n  \u003cencoder class=\"de.huxhorn.lilith.logback.encoder.ClassicLilithEncoder\"\u003e\n    \u003cIncludeCallerData\u003etrue\u003c/IncludeCallerData\u003e\n  \u003c/encoder\u003e\n\u003c/appender\u003e\n```\n\nYou also have to attach the appender to some logger, e.g. the root logger...\n\n```xml\n\u003croot level=\"INFO\"\u003e\n  \u003cappender-ref ref=\"FILE\"/\u003e\n\u003c/root\u003e\n```\n\n... or a specific logger...\n\n```xml\n\u003clogger name=\"foo.Bar\" level=\"DEBUG\"\u003e\n  \u003cappender-ref ref=\"FILE\"/\u003e\n\u003c/logger\u003e\n```\n\nUsing Lilith [`ClassicLilithEncoder`][cle] requires `de.huxhorn.lilith:de.huxhorn.lilith.logback.encoder.classic` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n\n#### ...and logback-access SocketAppender.\n\nLilith listens for logback-access [`SocketAppender`][lasa] connections on port 4570.\n\nA [`SocketAppender`][lasa]  establishes a connection with exactly one host that is defined in the `RemoteHost` property.\n\nAdd the following to your applications `logback-access.xml`:\n\n```xml\n\u003cappender name=\"LogbackAccess\" class=\"ch.qos.logback.access.net.SocketAppender\"\u003e \n  \u003cRemoteHost\u003elocalhost\u003c/RemoteHost\u003e\n  \u003cPort\u003e4570\u003c/Port\u003e \n  \u003cReconnectionDelay\u003e170\u003c/ReconnectionDelay\u003e \n  \u003cIncludeCallerData\u003etrue\u003c/IncludeCallerData\u003e\n\u003c/appender\u003e\n```\n\nand\n\n```xml\n\u003cappender-ref ref=\"LogbackAccess\" /\u003e\n```\n\nUsing logback-access [`SocketAppender`][lasa] requires `ch.qos.logback:logback-access` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n#### ...and Lilith AccessMultiplexSocketAppender.\n\nLilith is listening for Lilith [`AccessMultiplexSocketAppender`][amsa] connections on port 10010 (compressed) and 10011 (uncompressed). \n\nThe Lilith [`AccessMultiplexSocketAppender`][amsa] is a replacement for the logback-access [`SocketAppender`][lasa]. \n\nWhile logbacks appender is stream-based, i.e. it streams logging events using an `ObjectOutputStream`, the Lilith appender is message based, i.e. it sends logging events one after the other as single messages.\n\nA message consists of an integer that specifies the number of bytes of the following event, followed by the bytes of the serialized event.\n\nThis has several benefits:\n\n* Sending to multiple remote hosts is supported while the event is only serialized once.\n* Events can (and should) be compressed using GZIP.\n* The appender supports heartbeat and timeout. \n  * The event receiver can find out that the event sender connection died if a heartbeat is missing.\n  * The event sender can find out that the event receiver connection died by means of a timeout This means that an application won't stop (at least not for very long) in case of network problem.\n\nAdd the following to your applications `logback-access.xml`:\n\n```xml\n\u003cappender name=\"multiplex\" class=\"de.huxhorn.lilith.logback.appender.access.AccessMultiplexSocketAppender\"\u003e\n  \u003cCompressing\u003etrue\u003c/Compressing\u003e \u003c!-- will automatically use correct default port --\u003e\n  \u003c!-- Default port for compressed is 10010 and uncompressed 10011 --\u003e\n  \u003cReconnectionDelay\u003e30000\u003c/ReconnectionDelay\u003e\n  \u003cRemoteHosts\u003elocalhost\u003c/RemoteHosts\u003e\n\u003c/appender\u003e\n```\n\nand\n\n```xml\n\u003cappender-ref ref=\"multiplex\" /\u003e\n```\n\nUsing Lilith [`AccessMultiplexSocketAppender`][amsa] requires `de.huxhorn.lilith:de.huxhorn.lilith.logback.appender.multiplex-access` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n#### ...and logback-access with FileAppender.\n\nStarting with Lilith 0.9.38 and Logback 0.9.19, you can write Lilith files directly from within Logback.\n\nThose files can be opened by Lilith using either the Open command or drag\u0026drop.\n\nYou can also use the `tail` and `cat` command available in the executable Lilith jar. This has the huge advantage that you can decide about the [layout pattern][lapl] of the log file output at the time you are executing the above commands instead of while defining the file appender.\n\n```\n  Commands:\n    cat      Cat the given file.\n      Usage: cat [options] 'cat' the given Lilith logfile.\n        Options:\n          -n, --number-of-lines   number of entries printed by 'cat'.\n                                  Default: -1\n          -p, --pattern           pattern used by 'cat'. See\n                                  http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout and\n                                  http://logback.qos.ch/manual/layouts.html#AccessPatternLayout\n\n    tail      Tail the given file.\n      Usage: tail [options] 'tail' the given Lilith logfile.\n        Options:\n          -f, --keep-running      keep tailing the given Lilith logfile.\n                                  Default: false\n          -n, --number-of-lines   number of entries printed by 'tail'.\n                                  Default: 20\n          -p, --pattern           pattern used by 'tail'. See\n                                  http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout and\n                                  http://logback.qos.ch/manual/layouts.html#AccessPatternLayout\n```\n\nAdd the following to your applications `logback-access.xml`:\n\n```xml\n\u003cappender name=\"FILE\" class=\"ch.qos.logback.core.FileAppender\"\u003e\n  \u003cfile\u003eclassic.lilith\u003c/file\u003e\n  \u003cencoder class=\"de.huxhorn.lilith.logback.encoder.access.AccessLilithEncoder\"\u003e\n    \u003cIncludeCallerData\u003etrue\u003c/IncludeCallerData\u003e\n  \u003c/encoder\u003e\n\u003c/appender\u003e\n\n\u003cappender-ref ref=\"FILE\" /\u003e\n```\n\nUsing Lilith [`AccessLilithEncoder`][ale] requires `de.huxhorn.lilith:de.huxhorn.lilith.logback.encoder.access` as runtime dependency.\n\nTake a look at the [Logback manual][logbackm] and the Lilith help for more information.\n\n### ...with Log4j 2™.\nLilith is listening for [Log4j 2][log4j2]™ [`SocketAppender`][log4j2sa] connections...\n \n- ...using `SerializedLayout` on port 4445 or port 4560.\n- ...using `JsonLayout` on port 12000.\n- ...using `YamlLayout` on port 12010.\n- ...using `XmlLayout` on port 12020.\n\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003cconfiguration status=\"debug\"\u003e\n  \u003cappenders\u003e\n    \u003cConsole name=\"Console\" target=\"SYSTEM_OUT\"\u003e\n      \u003cPatternLayout pattern=\"%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} --- %msg%n\"/\u003e\n    \u003c/Console\u003e\n    \u003cSocket name=\"Socket-JSON\" host=\"localhost\" port=\"12000\" protocol=\"TCP\"\u003e\n      \u003cJsonLayout includeNullDelimiter=\"true\" /\u003e\n    \u003c/Socket\u003e\n    \u003cSocket name=\"Socket-YAML\" host=\"localhost\" port=\"12010\" protocol=\"TCP\"\u003e\n      \u003cYamlLayout includeNullDelimiter=\"true\" /\u003e\n    \u003c/Socket\u003e\n    \u003cSocket name=\"Socket-XML\" host=\"localhost\" port=\"12020\" protocol=\"TCP\"\u003e\n      \u003cXmlLayout includeNullDelimiter=\"true\" /\u003e\n    \u003c/Socket\u003e\n    \u003cSocket name=\"Socket-Serialized\" host=\"localhost\" port=\"4560\" protocol=\"TCP\"\u003e\n      \u003cSerializedLayout /\u003e\n    \u003c/Socket\u003e\n  \u003c/appenders\u003e\n  \u003cloggers\u003e\n    \u003croot level=\"all\"\u003e\n      \u003cappender-ref ref=\"Console\"/\u003e\n      \u003cappender-ref ref=\"Socket-JSON\"/\u003e\n      \u003cappender-ref ref=\"Socket-YAML\"/\u003e\n      \u003cappender-ref ref=\"Socket-XML\"/\u003e\n      \u003cappender-ref ref=\"Socket-Serialized\"/\u003e\n    \u003c/root\u003e\n  \u003c/loggers\u003e\n\u003c/configuration\u003e\n```\n\n`SerializedLayout` has been deprecated in Log4j2 2.9.0. You should instead use one one of the other options.\n\nTake a look at the [Log4j 2™ manual][log4j2m] for more information.\n\n### ...with log4j™.\nLilith is listening for [log4j][]™ [`SocketAppender`][log4jsa] connections on port 4445 or port 4560.\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" ?\u003e\n\u003c!DOCTYPE log4j:configuration SYSTEM \"log4j.dtd\"\u003e\n\u003clog4j:configuration xmlns:log4j=\"http://jakarta.apache.org/log4j/\"\u003e\n  \u003cappender name=\"socket\" class=\"org.apache.log4j.net.SocketAppender\"\u003e\n    \u003cparam name=\"Application\" value=\"YourApplication\"/\u003e\n    \u003cparam name=\"locationInfo\" value=\"true\"/\u003e\n    \u003cparam name=\"Port\" value=\"4560\"/\u003e\n    \u003cparam name=\"RemoteHost\" value=\"127.0.0.1\"/\u003e\n    \u003cparam name=\"ReconnectionDelay\" value=\"10\"/\u003e\n  \u003c/appender\u003e\n    \n  \u003croot\u003e\n    \u003cpriority value =\"ALL\" /\u003e\n    \u003cappender-ref ref=\"socket\" /\u003e\n  \u003c/root\u003e\n\u003c/log4j:configuration\u003e\n```\n\nTake a look at the [log4j™ manual][log4jm] for more information.\n\n### ...with java.util.logging.SocketHandler.\n\nSome people are forced to use [java.util.logging][jul]. If you are one of those poor souls, you have my deepest sympathy. Seriously.\n\nLilith is listening for [java.util.logging][jul] [`SocketHandler`][julsh] connections on port 11020.\n\nIf you are not exactly forced to keep using [java.util.logging][jul] I'd seriously suggest to consider a switch to the [SLF4J][]/[Logback][] combination.\n\nThe only missing feature that [java.util.logging][jul] has to offer are user-defined log-levels, albeit very, very poorly implemented. If you are actually using this feature then you are risking a memory leak. It would be a wise decision to use the [SLF4J][]-Marker-support instead. \n\nThe [java.util.logging][jul] `SocketHandler` does also have one major downside compared to all alternatives:\n   \n* It will only send the top-most exception of an exception-hierarchy.\n  You won't be able to see the root-cause(s) of an exception.\n* Suppressed exceptions, as introduced in Java 7, are also ignored.\n\nCheck out this [list of reasons to prefer logback over log4j™][reasons] for a quite detailed overview of the advantages you'll get if you decide to take the dive. While this page isn't related to [java.util.logging][jul] it will still give you a very good summary of all the nice features you'll get.\n\nLast but not least, you'd be able to use the Lilith [`ClassicMultiplexSocketAppender`][cmsa], a partially asynchronous appender designed for high-performance multiple-recipient usage in a live environment.\n\nConfigure [java.util.logging][jul] as usual and define a [`SocketHandler`][julsh] connecting to port 11020.\n\n```java\nLogger rootLogger=Logger.getLogger(\"\");\ntry {\n    SocketHandler fh = new SocketHandler(\"127.0.0.1\", 11020);\n    fh.setEncoding(\"UTF-8\");\n    fh.setFormatter(new XMLFormatter());\n    rootLogger.addHandler(fh);\n} catch(IOException ex) {\n    System.out.println(\"Couldn't connect the SocketHandler. Nope, no reconnect. What a fail.\");\n    ex.printStackTrace();\n}\n```\n\n## Building from source\n\nTo build Lilith from source, you need to first clone both [huxi/sulky](https://github.com/huxi/sulky) and [huxi/lilith](https://github.com/huxi/lilith).\n\n### Using Gradle\n\nBoth `sulky` and `lilith` are built using [Gradle][].\n\nYou have two options:\n\n1. install [Gradle][] on your system (but please make sure that you are using the correct version, most likely the latest)\n1. Use the gradlew wrapper scripts, either `./gradlew` (unix-like systems) or `gradlew.bat` (Windows) \n\nUsing the `gradlew` wrapper has the advantage that it always uses the correct gradle version but has the disadvantage that it is harder to use in submodules compared to a gradle installation in the path.\n\nIf you want to rebuild a submodule using `gradlew`, you have to change into the respective sub-directory and execute `gradlew` with the correct amount of `../` prepended to the command.\n\nWhenever I use `gradle` in the remainder of the document, I refer to either the locally installed `gradle` in your path or the `gradlew` wrapper script as explained above.\n\n### Building sulky\n\nChange into your local `sulky` directory and execute `gradle`. \n\nThis builds and tests all `sulky` modules.\n\nExecuting `gradle javadocZip`/`gradle sourceZip` creates a zip containing all javadocs/sources in `build/distributions`. \n\n### Building lilith\nBuilding `lilith` requires that you've built `sulky` first.\n\nThen change into your local `lilith` directory and execute `gradle`.\n\nThis creates all Lilith artifacts in `lilith/build/distributions` and `lilith/build/libs`.\n\nExecuting `gradle javadocZip`/`gradle sourceZip` creates a zip containing all javadocs/sources in `build/distributions`. \n\n## Help me!\n\nI'm looking for help concerning the development of IDE plugins.\n\nI've already developed a plugin for [IntelliJ IDEA][idea] (my IDE of choice) myself. It is contained in the `lilith-idea-plugin` folder. This plugin opens a ServerSocket on port 11111 and expects serialized [`StackTraceElement`][ste] instances. Lilith sends those events whenever the user clicks on either a callstack, an exception or part of an exception stacktrace. The plugin is doing its best to open the source location of the received element in the IDE.\n\nUnfortunately, I have neither time nor know-how about plugin development for either [Eclipse][] or [NetBeans][]. It would be very nice if you could could help me out.\n\nI'd also appreciate any help documenting Lilith.\n\nAnd I'm always eager to hear your opinion.\n\n## Thanks\nThanks to Ceki Gülcü ([@ceki](https://twitter.com/#!/ceki)) for developing [Logback][], the [Gradle][] ([@Gradleware](https://twitter.com/Gradleware)) community and all persons that have been involved with Lilith development.\n\nI'd also like to thank the developers of [Marked][] ([@MarkedApp](https://twitter.com/#!/MarkedApp)) for a really helpful, awesome and reasonably priced product.\n\nSimilarly, [Tower][] ([@gittower](https://twitter.com/#!/gittower)) is a really nice git client.\n\nAnd, of course, thanks to the [IntelliJ IDEA][idea] ([@intellijidea](https://twitter.com/#!/intellijidea)) for the best Java IDE and their support of open source projects.\n\n(This is all free advertisement, I don't get money from any of them.)\n\n## Legal mumbo-jumbo\nApache Extras Companion for Apache log4j, Apache log4j, Apache, the Apache feather logo, the Apache Logging Services project logo, the log4j logo, and the Built by Maven logo are trademarks of The Apache Software Foundation. Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of their respective owners.\n\nAll parts of Lilith that can be embedded into an application are [LGPL][]/[ASL][] dual-licensed. Lilith itself is [GPL][]-licensed.\n\nAll Your Base Are Belong To Us.\n\n[ale]: http://lilithapp.com/javadoc/de/huxhorn/lilith/logback/encoder/access/AccessLilithEncoder.html \"de.huxhorn.lilith.logback.encoder.access.AccessLilithEncoder\"\n[amsa]: http://lilithapp.com/javadoc/de/huxhorn/lilith/logback/appender/access/AccessMultiplexSocketAppender.html \"de.huxhorn.lilith.logback.appender.access.AccessMultiplexSocketAppender\"\n[asl]: http://www.apache.org/licenses/LICENSE-2.0.html \"Apache License, Version 2.0\"\n[chainsaw]: http://logging.apache.org/chainsaw/ \"Chainsaw\"\n[cle]: http://lilithapp.com/javadoc/de/huxhorn/lilith/logback/encoder/ClassicLilithEncoder.html \"de.huxhorn.lilith.logback.encoder.ClassicLilithEncoder\"\n[cmsa]: http://lilithapp.com/javadoc/de/huxhorn/lilith/logback/appender/ClassicMultiplexSocketAppender.html \"de.huxhorn.lilith.logback.appender.ClassicMultiplexSocketAppender\"\n[eclipse]: http://eclipse.org/ \"Eclipse IDE\"\n[gpl]: http://www.gnu.org/licenses/gpl.html \"The GNU General Public License v3.0\"\n[gradle]: http://gradle.org/ \"Gradle - A better way to build.\"\n[idea]: http://www.jetbrains.com/idea/ \"IntelliJ IDEA - The Most Intelligent Java IDE\"\n[jul]: http://download.oracle.com/javase/7/docs/api/java/util/logging/package-summary.html \"java.util.logging package\"\n[julsh]: http://docs.oracle.com/javase/7/docs/api/java/util/logging/SocketHandler.html \"java.util.logging.SocketHandler\"\n[lapl]: http://logback.qos.ch/manual/layouts.html#AccessPatternLayout \"logback-access PatternLayout\"\n[lasa]: http://logback.qos.ch/apidocs/ch/qos/logback/access/net/SocketAppender.html \"ch.qos.logback.access.net.SocketAppender\" \n[lcpl]: http://logback.qos.ch/manual/layouts.html#ClassicPatternLayout \"logback-classic PatternLayout\"\n[lcsa]: http://logback.qos.ch/apidocs/ch/qos/logback/classic/net/SocketAppender.html \"ch.qos.logback.classic.net.SocketAppender\"\n[lgpl]: http://www.gnu.org/licenses/lgpl.html \"GNU Lesser General Public License v3.0\"\n[log4j2]: http://logging.apache.org/log4j/2.x/ \"Apache Log4j 2™\"\n[log4j2m]: http://logging.apache.org/log4j/2.x/manual/index.html \"Log4j 2™ manual\"\n[log4j2sa]: http://logging.apache.org/log4j/2.x/manual/appenders.html#SocketAppender \"SocketAppender\"\n[log4j]: http://logging.apache.org/log4j/ \"Apache log4j™\"\n[log4jm]: http://logging.apache.org/log4j/1.2/manual.html \"log4j™ manual\"\n[log4jsa]: http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/net/SocketAppender.html \"org.apache.log4j.net.SocketAppender\"\n[logback]: http://logback.qos.ch/ \"Logback - the generic, reliable, fast \u0026 flexible logging framework\"\n[logbackm]: http://logback.qos.ch/manual/ \"Logback manual\"\n[marked]: http://markedapp.com/ \"marked - Markdown Preview for any text editor.\"\n[netbeans]: http://netbeans.org/ \"NetBeans IDE\"\n[reasons]: http://logback.qos.ch/reasonsToSwitch.html \"Reasons to prefer logback over log4j\"\n[slf4j]: http://www.slf4j.org/ \"Simple Logging Facade for Java (SLF4J)\"\n[ste]: http://download.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html \"java.lang.StackTraceElement\"\n[tower]: http://www.git-tower.com/ \"Tower - the most powerful Git client for Mac\"\n\n[img-lilith]: https://github.com/huxi/lilith/raw/master/images/lilith.png \"Lilith - a logging and access event viewer for Logback, log4j™ and java.util.logging.\"\n","funding_links":[],"categories":["Java","日志库"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuxi%2Flilith","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhuxi%2Flilith","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhuxi%2Flilith/lists"}