Adding logs window.

This commit is contained in:
Admin
2016-02-23 16:52:00 -06:00
parent 58fccb1fa7
commit 614734a2aa
6 changed files with 119 additions and 21 deletions

View File

@@ -5,7 +5,7 @@
<groupId>com.bwssystems.HABridge</groupId>
<artifactId>ha-bridge</artifactId>
<version>1.4.0a</version>
<version>1.4.0b</version>
<packaging>jar</packaging>
<name>HA Bridge</name>
@@ -43,7 +43,7 @@
<dependency>
<groupId>com.github.bwssytems</groupId>
<artifactId>nest-controller</artifactId>
<version>1.0.4</version>
<version>1.0.5</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>

View File

@@ -9,7 +9,6 @@ import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.List;
import org.apache.http.HttpStatus;
import org.slf4j.Logger;
@@ -19,22 +18,24 @@ import com.bwssystems.HABridge.dao.BackupFilename;
import com.google.gson.Gson;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusManager;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.read.CyclicBufferAppender;
public class SystemControl {
private static final Logger log = LoggerFactory.getLogger(SystemControl.class);
public static final String CYCLIC_BUFFER_APPENDER_NAME = "CYCLIC";
private LoggerContext lc;
private StatusManager statusManager;
private static final String SYSTEM_CONTEXT = "/system";
private BridgeSettings bridgeSettings;
private Version version;
private CyclicBufferAppender<ILoggingEvent> cyclicBufferAppender;
public SystemControl(BridgeSettings theBridgeSettings, Version theVersion) {
this.bridgeSettings = theBridgeSettings;
this.version = theVersion;
this.lc = (LoggerContext) LoggerFactory.getILoggerFactory();
this.statusManager = lc.getStatusManager();
reacquireCBA();
}
// This function sets up the sparkjava rest calls for the hue api
@@ -49,11 +50,30 @@ public class SystemControl {
// http://ip_address:port/system/logmsgs gets the version of this bridge instance
get (SYSTEM_CONTEXT + "/logmsgs", "application/json", (request, response) -> {
log.debug("Get logmsgs.");
log.debug("Get logmsgs.");
response.status(HttpStatus.SC_OK);
List<Status> theLogMsgs = statusManager.getCopyOfStatusList();
return "{\"message\":\"Service Unavailable\"}";
}, new JsonTransformer());
String logMsgs;
int count = -1;
if(cyclicBufferAppender == null)
reacquireCBA();
if (cyclicBufferAppender != null) {
count = cyclicBufferAppender.getLength();
}
logMsgs = "[";
if (count == -1) {
logMsgs = logMsgs + "{\"message\":\"Failed to locate CyclicBuffer\"}";
} else if (count == 0) {
logMsgs = logMsgs + "{\"message\":\"No logging events to display\"}";
} else {
LoggingEvent le;
for (int i = 0; i < count; i++) {
le = (LoggingEvent) cyclicBufferAppender.get(i);
logMsgs = logMsgs + ( i > 0?",{":"{") + "\"message\":\"" + le.getFormattedMessage() + "\"}";
}
}
logMsgs = logMsgs + "]";
return logMsgs;
});
// http://ip_address:port/system/settings which returns the bridge configuration settings
get(SYSTEM_CONTEXT + "/settings", "application/json", (request, response) -> {
@@ -175,6 +195,11 @@ public class SystemControl {
return null;
}, new JsonTransformer());
}
void reacquireCBA() {
cyclicBufferAppender = (CyclicBufferAppender<ILoggingEvent>) lc.getLogger(
Logger.ROOT_LOGGER_NAME).getAppender(CYCLIC_BUFFER_APPENDER_NAME);
}
protected void pingListener() {
try {

View File

@@ -1,13 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d [%thread] %-5level %logger - %msg%n</pattern>
</encoder>
</appender>
<appender name="CYCLIC" class="ch.qos.logback.core.read.CyclicBufferAppender">
<MaxSize>512</MaxSize>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="CYCLIC" />
</root>
</configuration>

View File

@@ -7,6 +7,9 @@ app.config(function ($routeProvider) {
}).when('/system', {
templateUrl: 'views/system.html',
controller: 'SystemController'
}).when('/logs', {
templateUrl: 'views/logs.html',
controller: 'LogsController'
}).when('/editor', {
templateUrl: 'views/editor.html',
controller: 'AddingController'
@@ -41,7 +44,7 @@ app.run( function (bridgeService) {
app.service('bridgeService', function ($http, $window, ngToast) {
var self = this;
this.state = {base: window.location.origin + "/api/devices", bridgelocation: window.location.origin, systemsbase: window.location.origin + "/system", huebase: window.location.origin + "/api", configs: [], backups: [], devices: [], device: [], type: "", settings: [], myToastMsg: [], olddevicename: "", isInControl: false, showVera: false, showHarmony: false, showNest: false, habridgeversion: ""};
this.state = {base: window.location.origin + "/api/devices", bridgelocation: window.location.origin, systemsbase: window.location.origin + "/system", huebase: window.location.origin + "/api", configs: [], backups: [], devices: [], device: [], type: "", settings: [], myToastMsg: [], logMsgs: [], olddevicename: "", isInControl: false, showVera: false, showHarmony: false, showNest: false, habridgeversion: ""};
this.displayWarn = function(errorTitle, error) {
if(error == null || typeof(error) != 'undefined') {
@@ -158,6 +161,17 @@ app.service('bridgeService', function ($http, $window, ngToast) {
);
};
this.viewLogs = function () {
return $http.get(this.state.systemsbase + "/logmsgs").then(
function (response) {
self.state.logMsgs = response.data;
},
function (error) {
self.displayWarn("Get log messages Error: ", error);
}
);
};
this.viewNestItems = function () {
if(!this.state.showNest)
return;
@@ -584,6 +598,17 @@ app.controller('SystemController', function ($scope, $location, $http, $window,
};
});
app.controller('LogsController', function ($scope, $location, $http, $window, bridgeService) {
bridgeService.viewLogs();
$scope.bridge = bridgeService.state;
$scope.predicate = '';
$scope.reverse = true;
$scope.order = function(predicate) {
$scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
$scope.predicate = predicate;
};
});
app.controller('ViewingController', function ($scope, $location, $http, $window, bridgeService, ngDialog) {
bridgeService.viewDevices();

View File

@@ -0,0 +1,42 @@
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="#">Bridge Devices</a></li>
<li role="presentation"><a href="#/system">Bridge Control</a></li>
<li role="presentation" class="active"><a href="#/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#/harmonyactivities">Harmony Activities</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#/harmonydevices">Harmony Devices</a></li>
<li ng-if="bridge.showNest" role="presentation"><a href="#/nest">Nest</a></li>
<li role="presentation"><a href="#/editor">Manual Add</a></li>
</ul>
<div class="panel panel-default bridgeServer">
<div class="panel-heading">
<h1 class="panel-title">Log Messages</h1>
</div>
<div class="panel-body">
<table class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>Row</th>
<th>
<a href="" ng-click="order('time')">Time</a>
<span class="sortorder" ng-show="predicate === 'time'" ng-class="{reverse:reverse}"></span></th>
<th>
<a href="" ng-click="order('level')">Level</a>
<span class="sortorder" ng-show="predicate === 'level'" ng-class="{reverse:reverse}"></span></th>
<th>
<a href="" ng-click="order('message')">Message</a>
<span class="sortorder" ng-show="predicate === 'message'" ng-class="{reverse:reverse}"></span></th>
</tr>
</thead>
<tr ng-repeat="logMessage in bridge.logMsgs | orderBy:predicate:reverse">
<td>{{$index+1}}</td>
<td>SomeTime</td>
<td>SomeLEvel</td>
<td>{{logMessage.message}}</td>
</tr>
</table>
</div>
</div>

View File

@@ -1,6 +1,7 @@
<ul class="nav nav-pills" role="tablist">
<li role="presentation"><a href="#">Bridge Devices</a></li>
<li role="presentation" class="active"><a href="#/system">Bridge Control</a></li>
<li role="presentation"><a href="#/logs">Logs</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#/veradevices">Vera Devices</a></li>
<li ng-if="bridge.showVera" role="presentation"><a href="#/verascenes">Vera Scenes</a></li>
<li ng-if="bridge.showHarmony" role="presentation"><a href="#/harmonyactivities">Harmony Activities</a></li>