Tiny Grafana Loki client (log sender) written in pure Java 1.8 without any dependencies.
MIT License
Tiny Grafana Loki client (log sender) written in pure Java 1.8 without any external dependencies.
HTTP sender requires http URL, optionally basic authentication credentials may be set.
Short example:
import pl.mjaron.tinyloki.*;
public class Sample {
public static void main(String[] args) {
LogController logController = TinyLoki
.withUrl("http://localhost/loki/api/v1/push")
.withBasicAuth("user", "pass")
.start();
ILogStream stream = logController.stream() // Before v0.3.2 use createStream()
.info()
.l("host", "MyComputerName")
.l("customLabel", "custom_value")
.build();
stream.log("Hello world.");
logController.softStop().hardStop();
}
}
Verbose example:
import pl.mjaron.tinyloki.*;
public class Sample {
public static void main(String[] args) {
// Initialize log controller instance with URL.
// Usually creating more than one LogController instance doesn't make sense.
// LogController owns separate thread which sends logs periodically.
LogController logController = TinyLoki
.withUrl("http://localhost/loki/api/v1/push")
.withBasicAuth("user", "pass")
.start();
// Create streams. It is thread-safe.
ILogStream stream = logController.createStream(
// Define stream labels...
// Initializing log level to verbose and adding some custom labels.
TinyLoki.verbose()
.l("host", "MyComputerName") // Custom static label.
.l("customLabel", "custom_value") // Custom static label.
// Label names should start with letter
// and contain letters, digits and '_' only.
// Bad characters will be replaced by '_'.
// If first character is bad, it will be replaced by 'A'.
);
// ... new streams and other logs here (thread-safe, non-blocking).
stream.log("Hello world.");
// Optionally flush logs before application exit.
logController
.softStop() // Try to send logs last time. Blocking method.
.hardStop(); // If it doesn't work (soft timeout) - force stop sending thread.
}
}
implementation 'io.github.mjfryc:mjaron-tinyloki-java:0.3.11'
Maven Central page, Maven Central repository URL
Click the Packages section on the right.
your_project_root/libs
dir. implementation files(project.rootDir.absolutePath + '/libs/mjaron-tinyloki-java-0.3.11.jar')
classDiagram
class Labels {
l(name, value) // Add the label
}
class ILogStream {
<<Interface>>
log(content)
log(timestamp, content)
release()
}
class ILogCollector {
<<Interface>>
createStream(labels)
collect()
contentType()
waitForLogs(timeout)
}
class ILogEncoder {
<<Interface>>
contentEncoding(): String
encode(final byte[] what): byte[]
}
class ILogMonitor {
<<Interface>>
onConfigured(contentType, contentEncoding)
onEncoded(in, out)
send(message)
sendOk(status)
sendErr(status, message)
onException(exception)
onWorkerThreadExit(isSoft)
}
class ILogSender {
<<Interface>>
configure(logSenderSettings, logMonitor)
send(bytes)
}
class LogController {
workerThread: Thread
stream(): StreamBuilder
createStream(labels)
start()
softStop()
hardStop()
}
class GzipLogEncoder
class VerboseLogMonitor
class ErrorLogMonitor
class JsonLogStream
class JsonLogCollector
class Settings {
+start(): LogController
}
class TinyLoki {
+withUrl(url)$
}
VerboseLogMonitor --|> ILogMonitor: implements
ErrorLogMonitor --|> ILogMonitor: implements
ILogStream <.. ILogCollector: create
ILogCollector --* LogController
Labels <.. ILogCollector : use
ILogSender --* LogController
GzipLogEncoder --|> ILogEncoder: implements
ILogEncoder --* LogController
ILogMonitor --* LogController
JsonLogStream --|> ILogStream: implements
JsonLogCollector --|> ILogCollector: implements
JsonLogStream <.. JsonLogCollector: create
HttpLogSender --|> ILogSender: implements
DummyLogSender --|> ILogSender: implements
Settings <.. TinyLoki: create
LogController <.. Settings: create