{"id":19152360,"url":"https://github.com/qos-ch/logback-tyler","last_synced_at":"2025-05-07T05:45:18.475Z","repository":{"id":223361259,"uuid":"756250523","full_name":"qos-ch/logback-tyler","owner":"qos-ch","description":"Logback XML configuration to Java translation project","archived":false,"fork":false,"pushed_at":"2025-01-30T21:39:21.000Z","size":304,"stargazers_count":14,"open_issues_count":1,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-31T06:51:11.698Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/qos-ch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-12T09:38:33.000Z","updated_at":"2025-03-29T22:29:16.000Z","dependencies_parsed_at":"2024-10-20T22:45:27.836Z","dependency_job_id":null,"html_url":"https://github.com/qos-ch/logback-tyler","commit_stats":null,"previous_names":["qos-ch/logback-tyler"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qos-ch%2Flogback-tyler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qos-ch%2Flogback-tyler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qos-ch%2Flogback-tyler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/qos-ch%2Flogback-tyler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/qos-ch","download_url":"https://codeload.github.com/qos-ch/logback-tyler/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249738800,"owners_count":21318504,"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":[],"created_at":"2024-11-09T08:17:34.114Z","updated_at":"2025-04-19T16:32:34.460Z","avatar_url":"https://github.com/qos-ch.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# logback-tyler\n\nLogback-tyler translates logback-classic XML configuration files into Java.\n\nThe resulting java class named `TylerConfigurator` implements the\n[`Configurator`](https://logback.qos.ch/xref/ch/qos/logback/classic/spi/Configurator.html)\ninterface. It can thus be declared as a custom configuration provider\nusing Java's standard\n[service-provider](https://docs.oracle.com/javase/6/docs/api/java/util/ServiceLoader.html)\nmeachanism. Custom configurators are searched by looking up a provider-configuration file\nresource located under the\n_META-INF/services/ch.qos.logback.classic.spi.Configurator_ file in\nyour project. This provider-configuration should contain a line with the fully\nqualified class name of your desired configurator.\n\nRunning `TylerConfigurator` does not require XML parsers and usually\nexecutes noticeably faster than `JoranConfigurator`, logback's XML\nconfigurator. Moreover, `TylerConfigurator` does not use\nreflection. In addition, given that it ships with your project's\nbinaries, it is harder to modify and offers an even smaller attack\nsurface.\n\nAt runtime, `TylerConfigurator` does not have any additional\ndependencies other than logback-classic version 1.5.11. \n\n## Online instance\nA instance of logback-tyler translator is available [**online**](https://logback.qos.ch/translator/services/xml2Java.html). \nDo not hesitate to experiment with it.\n\n## Running the translator locally\n\nLogback-tyler is located at the following Maven coordinates:\n```xml\n \u003cgroupId\u003ech.qos.logback.tyler\u003c/groupId\u003e\n \u003cartifactId\u003etyler-base\u003c/artifactId\u003e\n \u003cversion\u003e1.0.2\u003c/version\u003e\n```\n\nHere is a sample program to translate a logback.xml as string into Java.\n  \n```java\nimport ch.qos.logback.core.joran.spi.JoranException;\nimport ch.qos.logback.core.model.Model;\nimport ch.qos.logback.core.util.StatusPrinter;\n\nimport java.io.IOException;\n\npublic class TylerExample {\n\n    String xmlInput =\n    \"\"\"\n            \u003cconfiguration debug=\"true\"\u003e\n              \u003cimport class=\"ch.qos.logback.classic.encoder.PatternLayoutEncoder\"/\u003e\n              \n              \u003cproperty name=\"APP_NAME\" value=\"myApp\"/\u003e\n             \n              \u003ccontextName\u003e${APP_NAME}\u003c/contextName\u003e\n             \n              \u003cappender class=\"ch.qos.logback.core.FileAppender\" name=\"TOTO\"\u003e\n                \u003cfile\u003etoto.log\u003c/file\u003e\n                \u003cappend\u003etrue\u003c/append\u003e\n                \u003cimmediateFlush\u003etrue\u003c/immediateFlush\u003e\n                \u003cencoder\u003e\n                  \u003cpattern\u003e%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n\u003c/pattern\u003e\n                \u003c/encoder\u003e   \n              \u003c/appender\u003e         \n             \n             \n              \u003croot level=\"DEBUG\"\u003e\n                \u003cappender-ref ref=\"TOTO\"/\u003e\n              \u003c/root\u003e             \n            \u003c/configuration\u003e                 \n    \"\"\";\n    \n    public static void main(String[] args)  throws JoranException, IOException {\n        ContextBase context = new ContextBase();\n        ModelToJava m2j = new ModelToJava(context);\n        Model model = m2j.extractModel(xmlInput);\n        String result = m2j.toJava(model);\n        System.out.println(result);\n        // print any error messages occuring during the translation\n        StatusPrinter.print(context);\n    }\n}\n```\n\nrunning the above program will produce the following output\n\n```java\npackage com.example;\n\nimport ch.qos.logback.classic.Logger;\nimport ch.qos.logback.classic.LoggerContext;\nimport ch.qos.logback.classic.encoder.PatternLayoutEncoder;\nimport ch.qos.logback.classic.spi.Configurator;\nimport ch.qos.logback.classic.tyler.TylerConfiguratorBase;\nimport ch.qos.logback.core.FileAppender;\n\n/**\n *\n * \u003cp\u003eThis file was generated by logback-tyler version 1.0.2\u003c/p\u003e\n *\n * \u003cp\u003eEventual errors and warnings are appended at the end.\u003c/p\u003e\n *\n * \u003cp\u003eYou may experiment with logback.xml to Java translation, i.e.\n * TylerConfigurator generation, at the following URL:\u003c/p\u003e\n *\n * \u003cp\u003e     https://logback.qos.ch/translator/services/xml2Java.html \u003c/p\u003e\n *\n * \u003cp\u003eThis generated TylerConfigurator class is intended to be copied and integrated\n * into the user's project as a custom configurator. It will configure logback\n * without XML. You are free to rename TylerConfigurator as you wish.\u003c/p\u003e\n *\n * \u003cp\u003eIt requires logback-classic version 1.5.11 or later at runtime.\u003c/p\u003e\n *\n * \u003cp\u003eCustom configurators are looked up via Java's service-provide facility. If a\n * custom provider is found, it takes precedence over logback's own configurators,\n * e.g. DefaultJoranConfigurator.\u003c/p\u003e\n *\n * \u003cp\u003eTo install your custom configurator to your project, add a\n * provider-configuration file to the following path:\u003c/p\u003e\n *\n * \u003cpre\u003e  META-INF/services/ch.qos.logback.classic.spi.Configurator\u003c/pre\u003e\n *\n * \u003cp\u003eThis provider-configuration file should contain a line with the fully\n * qualified class name of your tyler configurator.\u003c/p\u003e\n *\n * \u003cp\u003eSee also item 1 of 'Configuration at initialization' section at \u003c/p\u003e\n *\n * \u003cp\u003e  https://logback.qos.ch/manual/configuration.html#auto_configuration\u003c/p\u003e\n *\n * \u003cp\u003eWith recent versions of logback and logback-tyler you can still\n * configure logger levels dynamically using properties files. Note that\n * configuration files in properties format can be watched for\n * changes. See the documentation on PropertiesConfigurator for more details.\u003c/p\u003e\n *\n * \u003cp\u003ehttps://logback.qos.ch/manual/configuration.html#propertiesConfigurator\u003c/p\u003e\n *\n * \u003cp\u003eKeep in mind that by integrating a .properties configuration file info\n * your tyler configurator, you can still change logger levels dynamically, without\n * redeploying your application.\u003c/p\u003e\n *\n */\npublic class TylerConfigurator extends TylerConfiguratorBase implements Configurator {\n  /**\n   * Appender variable referencing the appender named \"TOTO\".\n   */\n  protected FileAppender appenderTOTO;\n\n  /**\n   * \u003cp\u003eThis method performs configuration per {@link Configurator} interface.\u003c/p\u003e\n   *\n   * \u003cp\u003eIf \u003ccode\u003eTylerConfigurator\u003c/code\u003e is installed as a configurator service, this\n   * method will be called by logback-classic during initialization.\u003c/p\u003e\n   */\n  @Override\n  public Configurator.ExecutionStatus configure(LoggerContext loggerContext) {\n    setContext(loggerContext);\n    addOnConsoleStatusListener();\n    propertyModelHandlerHelper.handlePropertyModel(this, \"APP_NAME\", \"myApp\", \"\", \"\", \"\");\n    setContextName(subst(\"${APP_NAME}\"));\n    this.appenderTOTO = setupAppenderTOTO();\n    Logger logger_ROOT = setupLogger(\"ROOT\", \"DEBUG\", null);\n    logger_ROOT.addAppender(appenderTOTO);\n    return ExecutionStatus.DO_NOT_INVOKE_NEXT_IF_ANY;\n  }\n\n  FileAppender setupAppenderTOTO() {\n    FileAppender appender = new FileAppender();\n    appender.setContext(context);\n    appender.setName(\"TOTO\");\n    appender.setFile(\"toto.log\");\n    appender.setAppend(true);\n    appender.setImmediateFlush(true);\n\n    // Configure component of type PatternLayoutEncoder\n    PatternLayoutEncoder patternLayoutEncoder = new PatternLayoutEncoder();\n    patternLayoutEncoder.setContext(context);\n    patternLayoutEncoder.setPattern(\"%-4relative [%thread] %-5level %logger{35} -%kvp- %msg%n\");\n    patternLayoutEncoder.setParent(appender);\n    patternLayoutEncoder.start();\n    // Inject component of type PatternLayoutEncoder into parent\n    appender.setEncoder(patternLayoutEncoder);\n\n    appender.start();\n    return appender;\n  }\n}\n// 21:30:59,832 |-INFO in ch.qos.logback.tyler.base.handler.ImplicitModelHandler - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property\n// 21:30:59,833 |-INFO in ch.qos.logback.core.model.processor.DefaultProcessor@69998645 - End of configuration.\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqos-ch%2Flogback-tyler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fqos-ch%2Flogback-tyler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fqos-ch%2Flogback-tyler/lists"}