vlog.cc revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/vlog.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/basictypes.h"
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_number_conversions.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_split.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace logging {
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst int VlogInfo::kDefaultVlogLevel = 0;
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
163345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickVlogInfo::VlogInfo(const std::string& v_switch,
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   const std::string& vmodule_switch)
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    : max_vlog_level_(kDefaultVlogLevel) {
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  typedef std::pair<std::string, std::string> KVPair;
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!base::StringToInt(v_switch, &max_vlog_level_)) {
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(WARNING) << "Parsed v switch \""
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                 << v_switch << "\" as " << max_vlog_level_;
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::vector<KVPair> kv_pairs;
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!base::SplitStringIntoKeyValuePairs(
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick          vmodule_switch, '=', ',', &kv_pairs)) {
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LOG(WARNING) << "Could not fully parse vmodule switch \""
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                 << vmodule_switch << "\"";
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (std::vector<KVPair>::const_iterator it = kv_pairs.begin();
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick       it != kv_pairs.end(); ++it) {
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    int vlog_level = kDefaultVlogLevel;
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (!base::StringToInt(it->second, &vlog_level)) {
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      LOG(WARNING) << "Parsed vlog level for \""
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << it->first << "=" << it->second
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                   << "\" as " << vlog_level;
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    vmodule_levels_.push_back(std::make_pair(it->first, vlog_level));
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint VlogInfo::GetVlogLevel(const base::StringPiece& file) {
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!vmodule_levels_.empty()) {
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::StringPiece module(file);
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::StringPiece::size_type last_slash_pos =
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        module.find_last_of("\\/");
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (last_slash_pos != base::StringPiece::npos) {
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      module.remove_prefix(last_slash_pos + 1);
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    base::StringPiece::size_type extension_start = module.find('.');
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    module = module.substr(0, extension_start);
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    static const char kInlSuffix[] = "-inl";
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    static const int kInlSuffixLen = arraysize(kInlSuffix) - 1;
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (module.ends_with(kInlSuffix)) {
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      module.remove_suffix(kInlSuffixLen);
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    for (std::vector<VmodulePattern>::const_iterator it =
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick             vmodule_levels_.begin(); it != vmodule_levels_.end(); ++it) {
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // TODO(akalin): Use a less-heavyweight version of MatchPattern
603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      // (we can pretty much assume we're dealing with ASCII).
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      if (MatchPattern(module, it->first)) {
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        return it->second;
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      }
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return max_vlog_level_;
673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace
70