Tiny Grafana Loki client (log sender) written in pure Java 1.8 without any external dependencies.
- Implements JSON variant of Loki API
- Works with Android and Java SE
- Thread safe
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.
- Click the Packages section on the right.
- Find and download jar package from files list to e.g.
your_project_root/libs
dir. - Add this jar to project dependencies in build.gradle, e.g:
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