Skip to content

Commit

Permalink
Merge pull request #11 from Toparvion/#10-log-download
Browse files Browse the repository at this point in the history
#10-log-download
  • Loading branch information
Toparvion authored May 8, 2018
2 parents 2bec003 + ef841d1 commit d38004a
Show file tree
Hide file tree
Showing 65 changed files with 1,950 additions and 509 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@

memo.txt
log-samples/
/dist/deploy/
/dist/deploy-*/
application.log
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ The tool is in trial stage now and is being tested by Russian speaking users. Th

# АнаЛóг
**АнаЛóг** - это основанное на [tail](https://ru.wikipedia.org/wiki/Tail) веб-приложение, позволяющее просматривать в реальном времени одновременно несколько логов с удаленных тестовых серверов.
Основные особенности программы:
Основные возможности программы:
* просмотр логов через веб браузер;
_не требуется инсталляция специального ПО на клиентских машинах_;
* отображение новых записей в реальном времени;
Expand All @@ -19,6 +19,9 @@ _сообщение каждого уровня выводится в своем
_можно объединить несколько файлов (в т.ч. с разных серверов) в один виртуальный лог, который будет выводиться в браузере со строгим соблюдением временной последовательности и целостности записей (в т.ч. многострочных);_
* форматирование XML;
_АнаЛóг распознает XML-документы, расставляет для них отступы (даже если изначально XML был однострочным) и подсвечивает их синтаксис;_
* скачивание логов через браузер для открытия в текстовом редакторе;
_АнаЛóг позволяет скачать текущий файл лога, даже если он находится на удаленном узле агента АнаЛога.
При этом любой файл можно скачать как полностью, так и только последнюю его часть удобного размера._

### Как это работает?
АнаЛóг - Java-приложение, поставляемое в виде монолитного JAR-модуля и пары сопутствующих текстовых файлов. Приложение должно запускаться на том сервере, логи которого необходимо просматривать. После запуска приложение поднимает на указанном в настройках порту веб-интерфейс, через который пользователи могут выбирать и просматривать логи. Когда пользователь выбирает лог, приложение начинает отслеживать обновления этого лога при помощи встроенной в ОС утилиты `tail` (для Windows поставляется отдельно). Всякий раз, когда в логе появляется новая запись, `tail` передает ее АнаЛогу, а тот - рассылает ее всем клиентам (браузерам), прослушивающим этот лог.
Expand All @@ -29,7 +32,7 @@ _АнаЛóг распознает XML-документы, расстав
В такой схеме любой сервер АнаЛога может составлять композитный лог, включающий как локальные для него логи, так и удаленные, доступ к которым он получит через агентов. Получая данные из этих источников, сервер агрегирует их и рассылает всем клиентам (браузерам), прослушивающим композитный лог.

### Как установить и настроить?
Ссылка для скачивания и инструкция по установке приведены на странице [релиза v0.8](https://github.com/Toparvion/analog/releases/tag/v0.8).
Ссылка для скачивания и инструкция по установке приведены на странице [последнего релиза](https://github.com/Toparvion/analog/releases/latest).
Пример и пояснения к параметрам конфигурации можно [посмотреть в Wiki](https://github.com/Toparvion/analog/wiki/%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80-%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B8).

### Статус проекта
Expand Down
9 changes: 5 additions & 4 deletions bin/webctl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@
componentName="analog"
debugPort=8084

# Since default JDK on the server is JDK_1.6 we forcibly make JAVA_HOME to point to JDK_1.8
#JAVA_HOME=/usr/jdk/jdk1.8.0_92
JAVA_HOME=/pub/site/opt/jdk/jdk1.8.0_92
# Since default JDK on the server is JDK_1.6 we forcibly make JAVA_HOME to point to JDK_1.9
#JAVA_HOME=/usr/jdk/jdk-9.0.4

#Set APP_HOME to point on the application folder.
DIR=`dirname $0`
Expand All @@ -17,7 +16,9 @@ PID_FILE=$APP_HOME/$componentName.pid
JAVA_OPTS=`echo "
-D_$componentName
"`
JAVA_OPTS="$JAVA_OPTS -Xmx256m -XX:MaxMetaspaceSize=256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$debugPort -XX:+HeapDumpOnOutOfMemoryError"
JAVA_OPTS="$JAVA_OPTS -Xmx256m -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError"
JAVA_OPTS="$JAVA_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:$debugPort"
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"

if [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="$JAVA_HOME/bin/java"
Expand Down
34 changes: 18 additions & 16 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
buildscript {
ext {
springBootVersion = '2.0.0.M7'
springIntegrationVersion = '5.0.0.RELEASE'
springBootVersion = '2.0.1.RELEASE'
springIntegrationVersion = '5.0.4.RELEASE'
junitVersion = '5.0.2'
}
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/libs-snapshot' }
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath group: 'org.springframework.boot', name: 'spring-boot-gradle-plugin', version: "${springBootVersion}"
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.1'
}
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.junit.platform.gradle.plugin'
apply plugin: 'application'

jar {
version = '0.8.1'
version = '0.10'
archiveName = 'analog.jar'
manifest {
attributes(
Expand All @@ -29,8 +31,8 @@ jar {
)
}
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
sourceCompatibility = 1.9
targetCompatibility = 1.9

repositories {
// mavenLocal()
Expand All @@ -42,21 +44,20 @@ repositories {
dependencies {
// Backend compile deps
// compile("org.springframework.boot:spring-boot-devtools:${springBootVersion}")
compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}")
compile("org.springframework.boot:spring-boot-starter-actuator:${springBootVersion}")
compile("org.springframework.boot:spring-boot-starter-websocket:${springBootVersion}")
compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: "${springBootVersion}"
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: "${springBootVersion}"
compile group: 'org.springframework.boot' , name: 'spring-boot-starter-websocket', version: "${springBootVersion}"
compile group: 'net.bull.javamelody', name: 'javamelody-spring-boot-starter', version: '1.71.0'

compile group: 'org.springframework.integration', name: 'spring-integration-core', version: "${springIntegrationVersion}"
compile group: 'org.springframework.integration', name: 'spring-integration-file', version: "${springIntegrationVersion}"
compile group: 'org.springframework.integration', name: 'spring-integration-rmi', version: "${springIntegrationVersion}"

compile group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2'
compile group: 'net.sf.jtidy', name: 'jtidy', version: 'r938'
compile group: 'net.bull.javamelody', name: 'javamelody-core', version: '1.61.0'
// compile group: 'com.github.albfernandez', name: 'juniversalchardet', version: '2.0.0'
compile group: 'com.github.mpkorstanje', name: 'simmetrics-core', version: '4.1.1'

// FrontEnd deps
// Frontend deps
compile group: 'org.webjars', name: 'angularjs', version: '1.5.8'
compile group: 'org.webjars', name: 'highlightjs', version: '9.8.0'
compile group: 'org.webjars', name: 'jquery', version: '1.11.1'
Expand All @@ -68,13 +69,14 @@ dependencies {
compile group: 'org.webjars.npm', name: 'balloon-css', version: '0.5.0'

runtime group: 'commons-logging', name: 'commons-logging', version: '1.2'
runtime("org.springframework.boot:spring-boot-properties-migrator") // TODO remove after migration

// Test deps
testCompile("org.springframework.boot:spring-boot-starter-test:${springBootVersion}")
testCompile("org.junit.jupiter:junit-jupiter-api:${junitVersion}")
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: "${springBootVersion}"
testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "${junitVersion}"
testCompile group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1'

testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitVersion}")
testRuntime group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "${junitVersion}"
}

junitPlatform {
Expand Down
31 changes: 24 additions & 7 deletions config/application-win.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,26 @@ jmx:
host: localhost
port: 1099

clusterNodes:
nodes:
- name: angara
address: angara.ftc.ru:7801
host: angara.ftc.ru
agentPort: 7801
serverPort: 8080
# myself: true
- name: volga
address: volga.ftc.ru:7802
host: volga.ftc.ru
agentPort: 7802
- name: tobol
address: tobol.ftc.ru:7803
host: tobol.ftc.ru
agentPort: 7803

recordLevels:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FATAL

choices:
- group: MT
Expand All @@ -32,9 +44,12 @@ choices:
- path: C:\lang\analog\log-samples\generated\core.log
node: angara
timestamp: yyyy-MM-dd HH:mm:ss,SSS # 2017-11-09 22:31:03,084
# - node: tobol
# path: C:\lang\analog\log-samples\cluster\composite.log
# timestamp: dd.MM.yy HH:mm:ss,SSS
- node: volga
path: C:\lang\analog\log-samples\cluster\composite.log
timestamp: dd.MM.yy HH:mm:ss,SSS
- node: volga
path: C:\lang\analog\log-samples\cluster\composite-2.log
timestamp: dd.MM.yy HH:mm:ss,SSS

- group: Микросервисы
pathBase: C:\lang\analog\log-samples\
Expand All @@ -44,8 +59,10 @@ choices:
- cluster\composite.log as "$f (plain)"
compositeLogs:
- path: bankplus.log
node: volga
title: $f - $g
timestamp: dd.MM.yy HH:mm:ss,SSS
- path: logSample.log
node: tobol
title: $f - $g
timestamp: dd.MM.yy HH:mm:ss,SSS
Binary file renamed dist/analog-v0.8.1.zip → dist/analog.zip
Binary file not shown.
44 changes: 44 additions & 0 deletions doc/application-sample.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Настройки подключения конечных пользователей:
server:
port: 8080 # - этот порт должен быть указан в браузере;
address: mycompany.com # - имя/адрес хоста не обязательны; по умолчанию 0.0.0.0

# Список узлов, из которых состоит кластер АнаЛога (в том числе, если в нем всего один узел - текущий):
nodes:
- name: primary # читабельное имя узла (для удобства обращения)
host: mycompany.com # хост узла (без порта)
agentPort: 7801 # порт агента
serverPort: 9090 # порт сервера (тот же, что и server.port этого узла)
myself: true # признак того, что этот узел является сервером (см. выше);
# такой признак должен присутствовать только у одного (серверного) узла
- name: backup-node # читабельное имя второго узла
host: backup.mycompany.com # хост второго узла (число узлов не ограничено)
agentPort: 7801 # порт агента
# serverPort: 8080 # если порт удаленного сервера равен server.port текущего, можно опустить


# Варианты выбора логов из UI:
choices:
- group: MT # название группы вариантов (число групп не ограничено)
pathBase: C:\lang\analog\log-samples\ # базовый путь логов в этой группе (добавляется к началу других путей)
plainLogs: # список простых (одинарных) логов группы
- core.log as "static $f - $g"
# формат элемента списка: <fileNameOrPath>[ as "<alias>"[ (selected)]]
# , где <fileNameOrPath> - полный либо относительный путь к файлу лога (в зависимости от наличия pathBase),
# <alias> - отображаемое в UI имя лога в любом формате; поддерживаются подстановочные переменные:
# $f - имя и расширение файла лога, $g - имя группы (пример алиаса: "Тестовый $f - $g")
# (selected) - статичный признак, указывающая на то, что данный вариант лога будет выбран по умолчанию
- pppinfo.log as "$f - $g" (selected)
- generated\core.log as "$f - $g aka generated"
compositeLogs: # список композитных (составных) логов группы
- path: generated\bankplus.log # полный либо относительный путь к файлу лога (в зависимости от pathBase),
timestamp: dd.MM.yy HH:mm:ss,SSS # формат временной метки
node: primary # имя узла, где лежит лог (по умолчанию: узел с myself=true)
title: $f - $g # имя лога (формат см. выше)
# selected: true # признак выбора по умолчанию (должен быть лишь один на все варианты)
includes: # список других логов, входящих в состав композита
- node: backup-node # путь к включаемому логу (только абсолютный!)
path: /pub/home/me/logs/backup.log # имя узла с логом (по умолчанию: узел с myself=true)
timestamp: dd/MM/yy HH:mm:ss.SSS # формат временной метки
scanDir: C:\lang\analog\log-samples\to-scan # полный путь к директории, все файлы которой должны автоматически
# стать вариантами выбора логов (не включая поддиректории)
53 changes: 53 additions & 0 deletions doc/release-notes/v0.10.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# v0.10 - 'Download current log' feature

This release of AnaLog is aimed to shorten the gap between browser capabilities and real users' demands - while
AnaLog was deliberately designed with certain browser restrictions in mind, it is quite obvious that ability to work
with whole (usually big) log files is essential for day-to-day tasks. That is why AnaLog introduces this new
feature - log file
downloading directly from browser.

There are several changes to highlight:

* **Download current log** button is now available for any log (not plains only) and click on it does not trigger
downloading immediately anymore - instead a new 'Control Check' dialog is shown where:
* Current log's node, path, size and last modified timestamp are displayed;
* Download button is located along with its variants for downloading just last part of the log (50KB, 500KB, 5MB,
50MB, 200MB - depending of current log size);
* Dropdown select is displayed to choose a specific member of composite log (in case of latter only);
* Last error (if any) occurred while fetching log details (e.g. _HTTP 404 Not Found_, _HTTP 503 Unavailable_ etc).

* Host and ports of cluster properties are now set separately. There are 2 kind of ports to specify:
1. Agent port - a port to use by AnaLog server instance to support remote log monitoring;
2. Server port - a port to use by user browser and by other servers for downloading log files from agent
instances.
This port is not required and by default equals to `server.port` of current AnaLog instance.

* `clusterNodes` param has been renamed to `nodes` as well as its `address` property has been renamed to `host` as it doesn't contain port number anymore.
For example, if your configuration looks like:
```yaml
clusterNodes:
- name: alpha
address: alpha.example.com:7801
```
then it should be rewritten as:
```yaml
nodes:
- name: alpha
host: alpha.example.com
agentPort: 7801
serverPort: 8080 # may be omitted optional if equals to server.port
```
* Added `/download` resource to AnaLog's server HTTP API:
* `HEAD /download` returns content length and last modified timestamp of specified file even if it resides on
remote node;
* `GET /download` returns the specified file itself (as an attachment in order to facilitate streaming
downloading). This also works transparently even for files on remote nodes of AnaLog.

The new resource is designed to be used in various ways:
* By web client application (in browser) to start file downloading via dedicated button on the control panel;
* By other servers to retrieve files from agents in previous scenario;
* **By end users themselves** to download frequently used files (e.g. by making a browser bookmark).

* Every log choice is now provided with label containing its 'type' (local, remote, composite) and list of its nodes.
This is a groundwork for future support of remote plain logs and composite log configuration refactoring.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip
Loading

0 comments on commit d38004a

Please sign in to comment.