////
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
////
= Apache Log4j Samples: custom lookups

This project shows how to write a custom lookup.

In order to use it:

. install the artifact and its parent locally with `mvn install`,
. add it to your Maven project:
+
[xml]
----
<dependency>
  <groupId>org.apache.logging.log4j.samples</groupId>
  <artifactId>log4j-samples-loggerProperties</artifactId>
  <version>2.19.1-SNAPSHOT</version>
</dependency>
----
. use `$${custom:some_key}` in the pattern of your pattern layout,
. in your code assign some properties to a logger using `CustomLookup#setLoggerProperties`.
