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

add MessageStorage

上级 75456a7f
...@@ -21,6 +21,7 @@ import com.dianping.cat.message.spi.MessageConsumerRegistry; ...@@ -21,6 +21,7 @@ import com.dianping.cat.message.spi.MessageConsumerRegistry;
import com.dianping.cat.message.spi.MessageHandler; import com.dianping.cat.message.spi.MessageHandler;
import com.dianping.cat.message.spi.MessageManager; import com.dianping.cat.message.spi.MessageManager;
import com.dianping.cat.message.spi.MessagePathBuilder; 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.BufferWriter;
import com.dianping.cat.message.spi.codec.EscapingBufferWriter; import com.dianping.cat.message.spi.codec.EscapingBufferWriter;
import com.dianping.cat.message.spi.codec.HtmlEncodingBufferWriter; import com.dianping.cat.message.spi.codec.HtmlEncodingBufferWriter;
...@@ -31,6 +32,7 @@ import com.dianping.cat.message.spi.consumer.DumpToHtmlConsumer; ...@@ -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.DefaultMessageConsumerRegistry;
import com.dianping.cat.message.spi.internal.DefaultMessageHandler; import com.dianping.cat.message.spi.internal.DefaultMessageHandler;
import com.dianping.cat.message.spi.internal.DefaultMessagePathBuilder; 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.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component; import com.site.lookup.configuration.Component;
...@@ -50,6 +52,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { ...@@ -50,6 +52,9 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
.req(MessageManager.class)); .req(MessageManager.class));
all.add(C(MessagePathBuilder.class, DefaultMessagePathBuilder.class) // all.add(C(MessagePathBuilder.class, DefaultMessagePathBuilder.class) //
.req(MessageManager.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, "escape", EscapingBufferWriter.class));
all.add(C(BufferWriter.class, "html-encode", HtmlEncodingBufferWriter.class)); all.add(C(BufferWriter.class, "html-encode", HtmlEncodingBufferWriter.class));
......
...@@ -3,6 +3,7 @@ package com.dianping.cat.message.internal; ...@@ -3,6 +3,7 @@ package com.dianping.cat.message.internal;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Stack; import java.util.Stack;
import java.util.UUID;
import com.dianping.cat.configuration.model.entity.Config; import com.dianping.cat.configuration.model.entity.Config;
import com.dianping.cat.message.Message; import com.dianping.cat.message.Message;
...@@ -128,7 +129,7 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan ...@@ -128,7 +129,7 @@ public class DefaultMessageManager extends ContainerHolder implements MessageMan
m_tree.setThreadId(Long.toHexString(Thread.currentThread().getId())); m_tree.setThreadId(Long.toHexString(Thread.currentThread().getId()));
m_tree.setHostName(hostName); m_tree.setHostName(hostName);
m_tree.setIpAddress(ipAddress); 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) { public void add(DefaultMessageManager manager, Message message) {
......
...@@ -4,7 +4,9 @@ import java.io.File; ...@@ -4,7 +4,9 @@ import java.io.File;
import java.net.URL; import java.net.URL;
public interface MessagePathBuilder { 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 { ...@@ -18,15 +18,16 @@ public class DumpToHtmlConsumer implements MessageConsumer {
private MessageCodec m_codec; private MessageCodec m_codec;
@Inject @Inject
private MessagePathBuilder m_pathBuilder; private MessagePathBuilder m_builder;
@Override @Override
public void consume(MessageTree tree) { 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; FileOutputStream fos = null;
try { try {
ChannelBuffer buf = ChannelBuffers.buffer(8192); ChannelBuffer buf = ChannelBuffers.dynamicBuffer(8192);
m_codec.encode(tree, buf); m_codec.encode(tree, buf);
fos = new FileOutputStream(file); fos = new FileOutputStream(file);
...@@ -42,7 +43,6 @@ public class DumpToHtmlConsumer implements MessageConsumer { ...@@ -42,7 +43,6 @@ public class DumpToHtmlConsumer implements MessageConsumer {
} }
} }
} }
} }
@Override @Override
......
...@@ -24,28 +24,17 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa ...@@ -24,28 +24,17 @@ public class DefaultMessagePathBuilder implements MessagePathBuilder, Initializa
private URL m_baseLogUrl; private URL m_baseLogUrl;
@Override @Override
public File getLogViewFile(MessageTree tree) { public File getLogViewBaseDir() {
String relativePath = getRelativePath(tree); return m_baseLogDir;
File file = new File(m_baseLogDir, relativePath);
return file;
} }
@Override @Override
public URL getLogViewUrl(MessageTree tree) { public URL getLogViewBaseUrl() {
String relativePath = getRelativePath(tree); return m_baseLogUrl;
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);
}
} }
private String getRelativePath(MessageTree tree) { @Override
public String getLogViewPath(MessageTree tree) {
MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{1}/{2}"); MessageFormat format = new MessageFormat("{0,date,yyyyMMdd}/{1}/{2}");
Date date = new Date(tree.getMessage().getTimestamp()); Date date = new Date(tree.getMessage().getTimestamp());
String path = format.format(new Object[] { date, tree.getDomain(), tree.getMessageId() }); 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 @@ ...@@ -3,7 +3,7 @@
enable-xml-schema="true" enable-xml-sample="true"> enable-xml-schema="true" enable-xml-sample="true">
<entity name="config" root="true"> <entity name="config" root="true">
<attribute name="mode" required="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-ref name="property" type="map" />
</entity> </entity>
<entity name="app"> <entity name="app">
......
...@@ -46,6 +46,20 @@ ...@@ -46,6 +46,20 @@
</requirement> </requirement>
</requirements> </requirements>
</component> </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> <component>
<role>com.dianping.cat.message.spi.codec.BufferWriter</role> <role>com.dianping.cat.message.spi.codec.BufferWriter</role>
<role-hint>escape</role-hint> <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.
先完成此消息的编辑!
想要评论请 注册