/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed 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
*
* http://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.
*/
package org.wso2.carbon.logging.service;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.log4j.Appender;
import org.apache.log4j.Layout;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;
import org.wso2.carbon.base.ServerConfiguration;
import org.wso2.carbon.logging.config.ServiceConfigManager;
import org.wso2.carbon.logging.service.data.LogInfo;
import org.wso2.carbon.logging.service.data.LogMessage;
import org.wso2.carbon.logging.service.data.PaginatedLogInfo;
import org.wso2.carbon.logging.service.data.PaginatedLogMessage;
import org.wso2.carbon.logging.util.LoggingConstants;
import org.wso2.carbon.logging.util.LoggingUtil;
import org.wso2.carbon.utils.CarbonUtils;
import org.wso2.carbon.utils.DataPaginator;
import org.wso2.carbon.logging.appenders.MemoryAppender;
/**
* This is the Log Viewer service used for obtaining Log messages from locally
* and from a remote configured syslog server.
*/
public class LogViewer {
private static final LogMessage[] NO_LOGS_MESSAGE = new LogMessage[] { new LogMessage(
"NO_LOGS", "INFO") };
public PaginatedLogInfo getPaginatedLogInfo(int pageNumber, String tenantDomain, String serviceName)
throws Exception {
List<LogInfo> logInfoList = Arrays.asList(LoggingUtil.getLogsIndex(tenantDomain, serviceName));
// Pagination
PaginatedLogInfo paginatedLogInfo = new PaginatedLogInfo();
DataPaginator.doPaging(pageNumber, logInfoList, paginatedLogInfo);
return paginatedLogInfo;
}
public boolean isValidTenantDomain(String tenantDomain) {
return LoggingUtil.isValidTenantDomain(tenantDomain);
}
public boolean isSTSyslogConfig(String tenantDomain) throws Exception {
return LoggingUtil.isSTSyslogConfig(tenantDomain);
}
public LogMessage[] getLogs(String type, String keyword) throws AxisFault {
if (keyword == null || keyword.equals("")) {
// keyword is null
if (type == null || type.equals("") || type.equalsIgnoreCase("ALL")) {
return getLogsMessages();
} else {
// type is NOT null and NOT equal to ALL
return getLogsForType(type);
}
} else {
// keyword is NOT null
if (type == null || type.equals("")) {
// type is null
return getLogsForKey(keyword);
} else {
// type is NOT null and keyword is NOT null, but type can be
// equal to ALL
return searchLog(type, keyword);
}
}
}
public boolean isLogsConfigured(String tenantDomain) throws Exception {
return LoggingUtil.isLogsConfigured(tenantDomain);
}
public boolean isDataFromSysLog(String tenantDomain) throws Exception {
return LoggingUtil.isSysLogAppender(tenantDomain);
}
public String [] getServiceNames () throws LogViewerException {
return ServiceConfigManager.getServiceNames();
}
public boolean isStratosService() throws Exception {
return LoggingUtil.isStratosService();
}
public boolean isManager () {
return LoggingUtil.isManager();
}
public PaginatedLogMessage getPaginatedLogMessage(int pageNumber, String type, String keyword,
String logFile, String logIndex, int maxLines, int start, int end, String tenantDomain, String serviceName) throws Exception {
int headLogs = Integer.parseInt(logIndex);
if (headLogs > maxLines) {
headLogs = maxLines;
}
List<LogMessage> logMsgList = Arrays.asList(LoggingUtil.getTenantLogs(type, keyword,
logFile, logIndex, headLogs, start, end,tenantDomain,serviceName));
PaginatedLogMessage paginatedLogMessage = new PaginatedLogMessage();
LoggingUtil.doPaging(pageNumber, logMsgList, headLogs, paginatedLogMessage);
return paginatedLogMessage;
}
public PaginatedLogMessage getPaginatedBottomUpLogMessage(int pageNumber, String type,
String keyword, String logFile, int maxLines, int start, int end, String tenantDomain, String serviceName) throws Exception {
List<LogMessage> logMsgList = Arrays.asList(LoggingUtil.getBottomUpTenantLogs(type,
keyword, logFile, maxLines, start, end,tenantDomain, serviceName));
PaginatedLogMessage paginatedLogMessage = new PaginatedLogMessage();
LoggingUtil.doPaging(pageNumber, logMsgList, maxLines, paginatedLogMessage);
return paginatedLogMessage;
}
public int getLineNumbers(String logFile, String tenantDomain, String serviceName) throws Exception {
return LoggingUtil.getLineNumbers(logFile,tenantDomain,serviceName);
}
public String[] getLogLinesFromFile(String logFile, int maxLogs, int start, int end, String tenantDomain, String serviceName)
throws LogViewerException {
return LoggingUtil.getLogLinesFromFile(logFile, maxLogs, start, end, tenantDomain, serviceName);
}
private LogMessage[] getLogsForKey(String keyword) {
int DEFAULT_NO_OF_LOGS = 100;
int definedAmount;
Appender appender = Logger.getRootLogger().getAppender(
LoggingConstants.WSO2CARBON_MEMORY_APPENDER);
if (appender instanceof MemoryAppender) {
MemoryAppender memoryAppender = (MemoryAppender) appender;
if ((memoryAppender.getCircularQueue() != null)) {
definedAmount = memoryAppender.getBufferSize();
} else {
return NO_LOGS_MESSAGE;
}
Object[] objects;
if (definedAmount < 1) {
objects = memoryAppender.getCircularQueue().getObjects(DEFAULT_NO_OF_LOGS);
} else {
objects = memoryAppender.getCircularQueue().getObjects(definedAmount);
}
if ((memoryAppender.getCircularQueue().getObjects(definedAmount) == null)
|| (memoryAppender.getCircularQueue().getObjects(definedAmount).length == 0)) {
return NO_LOGS_MESSAGE;
}
Layout layout = memoryAppender.getLayout();
List<LogMessage> resultList = new ArrayList<LogMessage>();
for (int i = 0; i < objects.length; i++) {
LoggingEvent logEvt = (LoggingEvent) objects[i];
if (logEvt != null) {
String result = layout.format(logEvt);
if (result != null && result.toLowerCase().indexOf(keyword.toLowerCase()) > -1) {
resultList.add(new LogMessage(result, logEvt.getLevel().toString()));
}
}
}
if (resultList.isEmpty()) {
return NO_LOGS_MESSAGE;
}
return resultList.toArray(new LogMessage[resultList.size()]);
} else {
return new LogMessage[] { new LogMessage(
"The log must be configured to use the "
+ "org.wso2.carbon.logging.appenders.MemoryAppender to view entries on the admin console",
"") };
}
}
private LogMessage[] getLogsForType(String type) {
int DEFAULT_NO_OF_LOGS = 100;
int definedAmount;
Appender appender = Logger.getRootLogger().getAppender(
LoggingConstants.WSO2CARBON_MEMORY_APPENDER);
if (appender instanceof MemoryAppender) {
MemoryAppender memoryAppender = (MemoryAppender) appender;
if ((memoryAppender.getCircularQueue() != null)) {
definedAmount = memoryAppender.getBufferSize();
} else {
return NO_LOGS_MESSAGE;
}
Object[] objects;
if (definedAmount < 1) {
objects = memoryAppender.getCircularQueue().getObjects(DEFAULT_NO_OF_LOGS);
} else {
objects = memoryAppender.getCircularQueue().getObjects(definedAmount);
}
if ((memoryAppender.getCircularQueue().getObjects(definedAmount) == null)
|| (memoryAppender.getCircularQueue().getObjects(definedAmount).length == 0)) {
return NO_LOGS_MESSAGE;
}
Layout layout = memoryAppender.getLayout();
List<LogMessage> resultList = new ArrayList<LogMessage>();
for (int i = 0; i < objects.length; i++) {
LoggingEvent logEvt = (LoggingEvent) objects[i];
if (logEvt != null) {
Level level = logEvt.getLevel();
if (level.toString().equals(type)) {
resultList.add(new LogMessage(layout.format(logEvt), level.toString()));
}
}
}
if (resultList.isEmpty()) {
return NO_LOGS_MESSAGE;
}
return resultList.toArray(new LogMessage[resultList.size()]);
} else {
return new LogMessage[] { new LogMessage(
"The log must be configured to use the "
+ "org.wso2.carbon.logging.appenders.MemoryAppender to view entries through the admin console",
"") };
}
}
private LogMessage[] searchLog(String type, String keyword) throws AxisFault {
if ("ALL".equalsIgnoreCase(type)) {
return getLogsForKey(keyword);
} else {
LogMessage[] filerByType = getLogsForType(type);
List<LogMessage> resultList = new ArrayList<LogMessage>();
for (int i = 0; i < filerByType.length; i++) {
String logMessage = filerByType[i].getLogMessage();
if (logMessage != null
&& logMessage.toLowerCase().indexOf(keyword.toLowerCase()) > -1) {
resultList.add(filerByType[i]);
}
}
if (resultList.isEmpty()) {
return NO_LOGS_MESSAGE;
}
return resultList.toArray(new LogMessage[resultList.size()]);
}
}
private LogMessage[] getLogsMessages() throws AxisFault {
int DEFAULT_NO_OF_LOGS = 100;
int definedamount;
Appender appender = Logger.getRootLogger().getAppender(
LoggingConstants.WSO2CARBON_MEMORY_APPENDER);
PatternLayout tt;
if (appender instanceof MemoryAppender) {
MemoryAppender memoryAppender = (MemoryAppender) appender;
if ((memoryAppender.getCircularQueue() != null)) {
definedamount = memoryAppender.getBufferSize();
} else {
return NO_LOGS_MESSAGE;
}
Object[] objects;
if (definedamount < 1) {
objects = memoryAppender.getCircularQueue().getObjects(DEFAULT_NO_OF_LOGS);
} else {
objects = memoryAppender.getCircularQueue().getObjects(definedamount);
}
if ((memoryAppender.getCircularQueue().getObjects(definedamount) == null)
|| (memoryAppender.getCircularQueue().getObjects(definedamount).length == 0)) {
return NO_LOGS_MESSAGE;
}
LogMessage[] logMessages = new LogMessage[objects.length];
Layout layout = memoryAppender.getLayout();
for (int i = 0; i < objects.length; i++) {
LoggingEvent logEvt = (LoggingEvent) objects[i];
if (logEvt != null) {
Level level = logEvt.getLevel();
logMessages[i] = new LogMessage(layout.format(logEvt), level.toString());
}
}
return logMessages;
} else {
return new LogMessage[] { new LogMessage(
"The log must be configured to use the org.wso2.carbon."
+ "org.wso2.carbon.logging.appenders.MemoryAppender to view entries on the admin console",
"") };
}
}
}