提交 a6fbf769 编写于 作者: F Frankie Wu

add MessageStorage

上级 75456a7f
......@@ -21,6 +21,7 @@ import com.dianping.cat.message.spi.MessageConsumerRegistry;
import com.dianping.cat.message.spi.MessageHandler;
import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.message.spi.codec.BufferWriter;
import com.dianping.cat.message.spi.codec.EscapingBufferWriter;
import com.dianping.cat.message.spi.codec.HtmlEncodingBufferWriter;
......@@ -31,6 +32,7 @@ import com.dianping.cat.message.spi.consumer.DumpToHtmlConsumer;
import com.dianping.cat.message.spi.internal.DefaultMessageConsumerRegistry;
import com.dianping.cat.message.spi.internal.DefaultMessageHandler;
import com.dianping.cat.message.spi.internal.DefaultMessagePathBuilder;
import com.dianping.cat.message.spi.internal.DefaultMessageStorage;
import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component;
......@@ -50,6 +52,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(MessageManager.class));
all.add(C(MessagePathBuilder.class, DefaultMessagePathBuilder.class) //
.req(MessageManager.class));
all.add(C(MessageStorage.class, "html", DefaultMessageStorage.class) //
.req(MessagePathBuilder.class) //
.req(MessageCodec.class, "html-encode"));
all.add(C(BufferWriter.class, "escape", EscapingBufferWriter.class));
all.add(C(BufferWriter.class, "html-encode", HtmlEncodingBufferWriter.class));
......
......@@ -3,6 +3,7 @@ package com.dianping.cat.message.internal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Stack;
import java.util.UUID;
import com.dianping.cat.configuration.model.entity.Config;
import com.dianping.cat.message.Message;
......@@ -128,7 +129,7 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan
m_tree.setThreadId(Long.toHexString(Thread.currentThread().getId()));
m_tree.setHostName(hostName);
m_tree.setIpAddress(ipAddress);
m_tree.setMessageId("?"); // TODO
m_tree.setMessageId(UUID.randomUUID().toString()); // TODO optimize it to shorter UUID
}
public void add(DefaultMessageManager manager, Message message) {
......
......@@ -4,7 +4,9 @@ import java.io.File;
import java.net.URL;
public interface MessagePathBuilder {
public URL getLogViewUrl(MessageTree tree);
public File getLogViewBaseDir();
public File getLogViewFile(MessageTree tree);
public URL getLogViewBaseUrl();
public String getLogViewPath(MessageTree tree);
}
package com.dianping.cat.message.spi;
import java.io.File;
import java.net.URL;
public interface MessageStorage {
public File getBaseDir();
public URL getBaseUrl();
/**
* Store a message tree to the storage.
*
* @param tree
* message tree to store
* @return relative path to base directory or base URL
*/
public String store(MessageTree tree);
}
......@@ -18,15 +18,16 @@ public class DumpToHtmlConsumer implements MessageConsumer {
private MessageCodec m_codec;
@Inject
private MessagePathBuilder m_pathBuilder;
private MessagePathBuilder m_builder;
@Override
public void consume(MessageTree tree) {
File file = m_pathBuilder.getLogViewFile(tree);
File baseDir = m_builder.getLogViewBaseDir();
File file = new File(baseDir, m_builder.getLogViewPath(tree));
FileOutputStream fos = null;
try {
ChannelBuffer buf = ChannelBuffers.buffer(8192);
ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
m_codec.encode(tree, buf);
fos = new FileOutputStream(file);
......@@ -42,7 +43,6 @@ public class DumpToHtmlConsumer implements MessageConsumer {
}
}
}
}
@Override
......
......@@ -24,28 +24,17 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
private URL m_baseLogUrl;
@Override
public File getLogViewFile(MessageTree tree) {
String relativePath = getRelativePath(tree);
File file = new File(m_baseLogDir, relativePath);
return file;
public File getLogViewBaseDir() {
return m_baseLogDir;
}
@Override
public URL getLogViewUrl(MessageTree tree) {
String relativePath = getRelativePath(tree);
try {
URL url = new URL(m_baseLogUrl, relativePath);
return url;
} catch (MalformedURLException e) {
throw new RuntimeException(String.format("Unable to construct message URL(%s, %s)!", m_baseLogUrl,
relativePath), e);
}
public URL getLogViewBaseUrl() {
return m_baseLogUrl;
}
private String getRelativePath(MessageTree tree) {
@Override
public String getLogViewPath(MessageTree tree) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{1}/{2}");
Date date = new Date(tree.getMessage().getTimestamp());
String path = format.format(new Object[] { date, tree.getDomain(), tree.getMessageId() });
......
package com.dianping.cat.message.spi.internal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import org.codehaus.plexus.logging.LogEnabled;
import org.codehaus.plexus.logging.Logger;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBuffers;
import com.dianping.cat.message.spi.MessageCodec;
import com.dianping.cat.message.spi.MessagePathBuilder;
import com.dianping.cat.message.spi.MessageStorage;
import com.dianping.cat.message.spi.MessageTree;
import com.site.lookup.annotation.Inject;
public class DefaultMessageStorage implements MessageStorage, LogEnabled {
@Inject
private MessagePathBuilder m_builder;
@Inject
private MessageCodec m_codec;
private Logger m_logger;
@Override
public void enableLogging(Logger logger) {
m_logger = logger;
}
@Override
public File getBaseDir() {
return m_builder.getLogViewBaseDir();
}
@Override
public URL getBaseUrl() {
return m_builder.getLogViewBaseUrl();
}
@Override
public String store(MessageTree tree) {
String path = m_builder.getLogViewPath(tree);
File file = new File(m_builder.getLogViewBaseDir(), path);
ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
FileOutputStream fos = null;
file.getParentFile().mkdirs();
try {
m_codec.encode(tree, buf);
fos = new FileOutputStream(file);
buf.getBytes(buf.readerIndex(), fos, buf.readableBytes());
} catch (IOException e) {
m_logger.error(String.format("Error when writing to file(%s)!", file), e);
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
// ignore it
}
}
}
return path;
}
}
......@@ -3,7 +3,7 @@
enable-xml-schema="true" enable-xml-sample="true">
<entity name="config" root="true">
<attribute name="mode" required="true" />
<attribute name="base-log-dir" default-value="./catlog" />
<attribute name="base-log-dir" default-value="target/catlog" />
<entity-ref name="property" type="map" />
</entity>
<entity name="app">
......
......@@ -46,6 +46,20 @@
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.message.spi.MessageStorage</role>
<role-hint>html</role-hint>
<implementation>com.dianping.cat.message.spi.internal.DefaultMessageStorage</implementation>
<requirements>
<requirement>
<role>com.dianping.cat.message.spi.MessagePathBuilder</role>
</requirement>
<requirement>
<role>com.dianping.cat.message.spi.MessageCodec</role>
<role-hint>html-encode</role-hint>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.cat.message.spi.codec.BufferWriter</role>
<role-hint>escape</role-hint>
......
package com.dianping.cat;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
com.dianping.cat.message.AllTests.class,
com.dianping.cat.consumer.AllTests.class,
})
public class AllAllTests {
}
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册